Blog JSystems - uwalniamy wiedzę!

Szukaj

Power Query w Excelu, Power BI i Fabric

CSV wczytuje się do jednej kolumny - zły ogranicznik w Power Query

W skrócie

  • Plik CSV wczytuje się w Power Query do jednej kolumny Column1, w której stoją całe wiersze ze średnikami. Przy okazji potrafią zniknąć części dziesiętne kwot, bo przecinek dziesiętny został potraktowany jak granica kolumn.
  • Power Query dzieli wiersze innym znakiem, niż użyto w pliku. Eksporty z kursu rozdzielają kolumny średnikiem, a funkcja Csv.Document bez parametru Delimiter przyjmuje przecinek. Liczbę kolumn ustala parametr Columns albo, gdy go brak, pierwszy wiersz pliku.
  • Ustaw właściwy Ogranicznik w oknie importu albo w kroku Źródło, a w kodzie popraw razem Delimiter i Columns. Dzielenie kolumny według ogranicznika stosuj tylko awaryjnie i sprawdź, czy kwoty nie zostały ucięte.

Plik CSV w jednej kolumnie to w Power Query częsty problem przy pierwszym imporcie eksportu z systemu sprzedażowego albo księgowego. Pokazujemy, jak rozpoznać zły ogranicznik, gdzie go zmienić w oknie importu i w kodzie M oraz dlaczego awaryjne dzielenie kolumny potrafi po cichu uciąć grosze. Zachowanie funkcji Csv.Document sprawdziliśmy w polskim Excelu na danych w układzie eksportów sprzedaży z kursu.

Jak to wygląda w praktyce

Po imporcie podgląd ma jedną kolumnę Column1, a w każdej komórce stoi cały wiersz pliku, na przykład 01.01.2026;Nordvella Wrocław;1;2528,62. W pliku rozdzielanym średnikiem czytanym z przecinkiem jako ogranicznikiem dzieje się coś jeszcze: przecinek dziesiętny jest dla Power Query granicą kolumn. W naszym teście komórka zawierała 01.01.2026;Nordvella Wrocław;1;2528, a końcówka 62 zniknęła bez komunikatu o błędzie, bo nie zmieściła się w jedynej kolumnie.

Odwrotna sytuacja daje inny obraz. Plik rozdzielany przecinkami z polskimi kwotami bez cudzysłowów, na przykład Nordvella Wrocław,2528,62, ma w takim wierszu o jedno pole więcej niż w nagłówku. Wynik ma dwie kolumny, a w kolumnie kwoty stoi 2528 zamiast 2528,62.

Dlaczego tak się dzieje

Plik CSV to tekst, w którym kolumny oddziela umówiony znak. Power Query ustala go przy imporcie i zapisuje w kroku Źródło jako parametr Delimiter funkcji Csv.Document. Opis funkcji podaje, że domyślnym ogranicznikiem jest przecinek. W kodzie z kursu krok wygląda tak:

Csv.Document(Parametr, [Delimiter = ";", Columns = 10, Encoding = 65001, QuoteStyle = QuoteStyle.None])

Parametr Columns ustala liczbę kolumn. Według opisu funkcji nadmiarowe wartości w wierszu są wtedy pomijane, a brakujące uzupełniane wartością null. Gdy Columns nie ma, liczbę kolumn wyznaczają dane: w naszym teście pierwszy wiersz bez ogranicznika dał jedną kolumnę, choć dalsze wiersze miały więcej pól. Stąd dwa skutki złego ogranicznika naraz: jedna kolumna i ucięte końcówki pól.

Jak to rozwiązać krok po kroku

  1. Sprawdź, jakim znakiem rozdzielono plik: otwórz go w Notatniku i spójrz na wiersz nagłówka i pierwszy wiersz danych. Średniki między polami i przecinki w kwotach oznaczają ogranicznik Średnik.
  2. W istniejącym zapytaniu kliknij ikonę koła zębatego przy kroku Źródło na liście Zastosowane kroki. W oknie z polami Pochodzenie pliku, Ogranicznik i Wykrywanie typu danych rozwiń listę Ogranicznik i wybierz właściwy znak, na przykład Średnik, Przecinek albo Tabulator. Dla innego znaku wybierz opcję niestandardową i wpisz go.
  3. Przy nowym imporcie to samo pole znajdziesz w oknie podglądu po wybraniu na karcie Dane polecenia Pobierz dane, Z pliku, Z pliku tekstowego/CSV, a przy łączeniu folderu w oknie Połącz pliki. Ustaw Ogranicznik, zanim przejdziesz dalej.
  4. Jeśli poprawiasz kod, zmień w pasku formuły kroku Źródło jednocześnie Delimiter i Columns, na przykład z [Delimiter = ",", Columns = 1] na [Delimiter = ";", Columns = 10]. Sama zmiana ogranicznika nie wystarczy: w naszym teście Delimiter = ";" z pozostawionym Columns = 1 dał jedną kolumnę z samą datą, bo pozostałe pola Power Query pominął.
  5. Przejrzyj kolejne kroki zapytania. Te, które powstały na jednej kolumnie, na przykład zmiana typu albo promowanie nagłówków, mogą odwoływać się do nazw, których po poprawce już nie ma. Usuń je krzyżykiem i dodaj od nowa na właściwych kolumnach.
  6. Awaryjnie, gdy nie możesz zmienić kroku Źródło, zaznacz kolumnę Column1 i na karcie Przekształć wybierz Podziel kolumny, Według ogranicznika, a w oknie Dzielenie kolumny według ogranicznika wskaż średnik. Zrób to tylko wtedy, gdy kolumna zawiera całe wiersze. Jeśli plik czytano z przecinkiem, końcówki kwot już zginęły i podział ich nie przywróci: w naszym teście kwota 2528,62 dała po podziale 2528.
  7. W plikach rozdzielanych przecinkami polskie kwoty muszą stać w cudzysłowach, na przykład Nordvella Wrocław,"2528,62". Przecinek wewnątrz pola nie dzieli wtedy kolumn: w naszym teście wynik miał dwie kolumny i pełną kwotę 2528,62 zarówno z QuoteStyle.None, jak i z QuoteStyle.Csv. Jeśli eksport nie stawia cudzysłowów, poproś o średnik jako ogranicznik.
Okno Połącz pliki w Dataflow Gen2 z polem Ogranicznik ustawionym na Średnik, kodowaniem UTF-8 i podglądem pliku CSV podzielonego na kolumny
Pole Ogranicznik w oknie Połącz pliki w Dataflow Gen2, ustawione na Średnik. Przy właściwym ograniczniku eksport Nordvelli rozkłada się na osobne kolumny: Data, Nr paragonu, Sklep, Kod produktu i dalsze.

Jak sprawdzić, że zadziałało

Po zmianie podgląd powinien mieć tyle kolumn, ile nagłówków ma plik, w eksportach z kursu dziesięć: od Data do Płatność. Sprawdź kwoty z częścią dziesiętną, na przykład kolumnę Wartość netto: wartości muszą mieć grosze, takie jak 2528,62, a nie same złote. Po zmianie typu na liczbę dziesiętną kolumny kwot nie powinny mieć błędów, co pokaże Jakość kolumn na karcie Widok.

Żeby problem nie wrócił, ustal z dostawcą eksportu stały ogranicznik i nie zmieniaj go między plikami. Pliki o różnych ogranicznikach w jednym folderze trzeba rozdzielić, bo krok Źródło w zapytaniu Przekształć przykładowy plik obsługuje jeden ogranicznik dla wszystkich plików.

Wróć do listy: 88 najczęstszych pytań i problemów związanych z Power Query

Baner szkolenia Microsoft Excel - Power Query w JSystems z edytorem Power Query na ekranie laptopa

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

Najczęściej zadawane pytania

Jaki ogranicznik przyjmuje Csv.Document, gdy go nie podasz?
Przecinek. Tak mówi opis funkcji i tak zachował się nasz test: plik rozdzielany średnikiem bez parametru Delimiter wczytał się do jednej kolumny. W kodzie pisanym ręcznie podawaj więc Delimiter jawnie, na przykład średnik dla eksportów z kursu.
Czy mogę po prostu podzielić kolumnę według średnika?
Tylko wtedy, gdy kolumna zawiera całe wiersze. Jeśli plik czytano z przecinkiem jako ogranicznikiem, Power Query uciął pola na przecinkach dziesiętnych i podział tego nie cofnie. W naszym teście kwota 2528,62 dała po podziale 2528, dlatego pewniejsza jest zmiana ogranicznika w kroku Źródło.
Co zrobić z plikiem, w którym kwoty mają przecinek i kolumny też rozdziela przecinek?
Taki plik czyta się poprawnie tylko wtedy, gdy kwoty stoją w cudzysłowach. Bez cudzysłowów wiersz ma więcej pól niż nagłówek, Power Query pomija nadmiarowe części i kwota traci grosze. Poproś dostawcę o średnik jako ogranicznik albo o cudzysłowy wokół pól.
Jak ustawić ogranicznik inny niż średnik, przecinek czy tabulator?
Na liście Ogranicznik są też Spacja, Dwukropek i Znak równości oraz opcja niestandardowa, w której wpisujesz własny znak. W kodzie podajesz go w parametrze Delimiter funkcji Csv.Document. Opis funkcji wymaga, żeby w rekordzie opcji był to pojedynczy znak.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...