Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power Query w Excelu, Power BI i Fabric
Liczby z kropką dziesiętną dają błąd w polskim Excelu - jak wczytać je z CSV i API
Eksport z systemu księgowego, plik CSV od dostawcy albo odpowiedź API zapisują liczby z kropką dziesiętną, a polski Excel oczekuje przecinka. W Power Query kropka i przecinek w liczbach decydują, czy kolumna zamieni się w liczby, w błędy, czy w zupełnie inne wartości. Pokazujemy, co dokładnie się dzieje, jak wczytać takie dane poprawnie i czego nie robić. Każdy przykład sprawdziliśmy w polskim Excelu.
Po imporcie pliku CSV i zmianie typu kolumny na liczbę dziesiętną część komórek albo cała kolumna pokazuje Error. Po kliknięciu w puste miejsce takiej komórki zobaczysz na dole komunikat:
DataFormat.Error: Nie możemy przekonwertować na typ Number.
Szczegóły:
12.5Angielski oryginał: DataFormat.Error: We couldn't convert to Number. W szczegółach stoi wartość, która nie przeszła. Ten sam błąd dają w kolumnie niestandardowej Number.FromText("12.5") i Number.From("12.5") oraz Number.FromText("1.234", "pl-PL"), czyli każda konwersja tekstu z kropką bez wskazanej kultury albo z kulturą polską.
Zmiana typu w Power Query to konwersja tekstu na liczbę według kultury, czyli zestawu reguł zapisu liczb i dat danego kraju (ang. locale). Jeśli krok nie wskazuje kultury, Power Query używa ustawień regionalnych pliku albo systemu. W polskich ustawieniach separatorem dziesiętnym jest przecinek, więc tekst 12,5 zamienia się w liczbę 12,5, a 12.5 w błąd. Krok Zmieniono typ, który Power Query dodaje automatycznie po imporcie CSV, nie wskazuje kultury.
Dwie pułapki, które sprawdziliśmy w Excelu:
Number.FromText("12,5", "en-US") zwraca 125, bez żadnego błędu. Kulturę en-US ustawiaj więc tylko dla kolumn, które naprawdę mają kropkę dziesiętną.Liczba zapisana w JSON bez cudzysłowów, jak pole mid z kursem w API NBP, trafia do Power Query od razu jako liczba, więc ustawienia regionalne nie mają znaczenia (sprawdziliśmy to na wartości 4.2512). Problem dotyczy API, które podaje liczby w cudzysłowach, czyli jako tekst.
Table.TransformColumnTypes, na przykład "en-US".de-DE: w naszym teście dała 1234,56.Number.FromText([kurs], "en-US") albo zmień typ z ustawieniami regionalnymi jak wyżej. Tę samą kulturę możesz podać w funkcji Number.From, na przykład Number.From("12.5", "en-US") zwraca 12,5.
Pełny wzorzec w kodzie M, sprawdzony w polskim Excelu na tekście w formacie CSV ze średnikiem jako ogranicznikiem:
let
Źródło = Csv.Document("Sklep;Kwota#(lf)Gdańsk;12.5#(lf)Kraków;1250.75", [Delimiter = ";"]),
Nagłówki = Table.PromoteHeaders(Źródło),
Typy = Table.TransformColumnTypes(Nagłówki, {{"Kwota", type number}}, "en-US")
in
TypyKolumna Kwota zawiera liczby 12,5 i 1250,75, a ich suma to 1263,25. Przy prawdziwym pliku w miejscu tekstu stoi File.Contents ze ścieżką. Po zmianie typu włącz na karcie Widok pole Jakość kolumn: w kolumnie nie może być błędów. W Profilu kolumny sprawdź wartości minimalne i maksymalne, bo liczba wyraźnie większa od reszty, na przykład 125 zamiast 12,5, zdradza kulturę en-US zastosowaną do polskiego zapisu. Na koniec porównaj sumę z sumą w systemie, z którego pochodzi eksport.
Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query
Szkolenie Microsoft Excel - Power Query --> Dwa dni warsztatów z Excela: pobieranie danych z plików, folderów, SharePointa i baz SQL, ich czyszczenie i łączenie w Power Query, praca w języku M, a na koniec model danych i oparta na nim tabela przestawna. Prowadzi Sebastian Stasiak.
To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.
★★★★★Średnia ocena naszych szkoleń w Google: 5/5
Komentarze (0)
Brak komentarzy...