Power Query - CSV einlesen ohne Quote-Zeichen
#1
Hi,

ich stehe gerade mal wieder vor einer Herausforderung. Ich habe eine CSV-Datei (SAP-Export), bei der keine Quote-Zeichen verwendet werden. Ist soweit OK. Jetzt ist es nur so, dass es da in SAP eine Freitext-Spalte gibt, in der die Benutzer eintragen können, was immer sie wollen. Wenn jetzt in dieser Spalte jemand als erstes Zeichen ein Anführungszeichen (") eingibt ohne es am Ende nochmals einzugeben, dann interpretiert das Power Query als Quote-Zeichen und alle anderen Zeichen bis zum Zeilenende landen in dieser Spalte anstatt in den korrekten weiteren Spalten. Dies betriff im Schnitt etwa eine von 4.000 Zeilen in der CSV (bei mehreren 10.000 Zeilen).

Ich arbeite mit PowerBI. In Excel selbst wäre das kein Problem. Dort kann man beim Legacy-Text-Import das Quote-Zeichen festlegen (auch explizit "[Kein]". Dies wäre genau das, was ich auch in PQ bräuchte. Leider scheint es das nicht zu geben. Hat jemand eine Idee für mich?

Zur Not würde es auch reichen, innerhalb eines vbs-Skriptes einfach alle "-Zeichen in der CSV-Datei zu löschen. Denn zum Abruf aus SAP wird ein solches Skript sowieso verwendet. Allerdings habe ich keine Ahnung, wie ich dies in VBS bewerkstellige, Mit VBA kenne ich mich zwar ganz gut aus, allerdings nicht wirklich wenn es um Dateizugriffe geht. Und VBS ist da - glaube ich - dann doch nochmals etwas anders.

Ich hoffe irgendjemand kann mir weiter helfen.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#2
Hi,

da ich gerade per PN gefragt wurde, wie man sich das vorzustellen hat, hier nochmals eine kurze Erläuterung.

Die problematische Zeile sieht in etwa so aus wie die erste Zeile alle anderen Zeilen sind OK.
Code:
1.Spalte    "hier der Text    3.Spalte    4.Spalte    5.Spalte
1.Spalte    "hier der Text"    3.Spalte    4.Spalte    5.Spalte
1.Spalte    hier der Text    3.Spalte    4.Spalte    5.Spalte
1.Spalte    hier "der Text    3.Spalte    4.Spalte    5.Spalte
1.Spalte    hier "der Text"    3.Spalte    4.Spalte    5.Spalte
Die Lücken zwischen den Spalten sind Tabulatoren. Ich weiß nicht, ob das über die Forumssoftware korrekt rüber kommt.

Das Anführungszeichen als Start der 2. Spalte bringt den Import durcheinander und das Ergebnis ist, dass die erste Zeile nur 2 Spalten hat, wobei die 2. Spalte den Inhalt der Spalten 2 bis 5 bekommt.

Die Zeilen 2 - 5 erhalten wie erwartet ganz korrekt alle 5 Spalten.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#3
Code:
let
    Quelle = Table.FromColumns({Lines.FromBinary(File.Contents("D:\Tmp\Data.txt"), null, null, 1252)}),
    #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None), {"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5"})
in
    #"Spalte nach Trennzeichen teilen"

Hilft Das?

QuoteStyle.Type - PowerQuery M | Microsoft Learn
[-] Folgende(r) 1 Nutzer sagt Danke an Warkings für diesen Beitrag:
  • HKindler
Antworten Top
#4
Hi,

passt perfekt! auf die Idee die Datei als Text- statt CSV-Datei zu lesen und dann "händisch" in Spalten aufzuteilen bin ich nicht gekommen.

Bisher sah der Start meiner Abfrage so aus (RootPath und SubPath sind Parameter, die den Pfad zur Datei festlegen):
Code:
let
    Quelle = Csv.Document(File.Contents(RootPath & SubPath & "ZMM_PR_REL.txt"),[Delimiter="#(tab)", Columns=60, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Entfernte oberste Zeilen" = Table.Skip(#"Quelle",4),
Jetzt lautet er
Code:
let
    Quelle = Table.FromColumns({Lines.FromBinary(File.Contents(RootPath & SubPath & "ZMM_PR_REL.txt"), null, null, 1252)}),
    #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None), 100),
    #"Entfernte oberste Zeilen" = Table.Skip(#"Spalte nach Trennzeichen teilen",4),
Statt der Liste der Spalten {"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", ...} habe ich einfach einmal die Zahl 100 eingefügt. Im Moment sind es zwar nur 54 Spalten, aber ich hatte schon öfters Änderungen in der Spaltenzahl. Natürlich muss ich nun im Nachgang die überflüssigen Spalten löschen, aber das ist wenig Aufwand.

Vielen Dank für den Schubs in die richtige Richtung!
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#5
Es geht natürlich auch 
Code:
let
    Quelle = Table.FromColumns({Lines.FromBinary(File.Contents("D:\Tmp\Data.txt"), null, null, 1252)}),
    #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None))
in
    #"Spalte nach Trennzeichen teilen"

PS Du beklagst Dich hoffentlich nicht darüber, wenn Fragesteller keine Beispieldatei zur Verfügung stellen und das ganze Problem so nach und nach beschreiben   Dodgy
Antworten Top
#6
Hi Warkings,

doch ich beschwere mich über fehlende Dateien - wenn dies angebracht ist. Allerdings dachte ich, dass ich mein Problem anschaulich genug beschrieben hätte. Offensichtlich war das nicht der Fall. Blush

Ich habe dann ja, nachdem jemand anderes per PN um weitere Erläuterungen gebeten hatte, mit meinem 2. Post nachgebessert und es hoffentlich ausreichend beschrieben. Zumindest hast du eine vernünftige und zielführende Lösungsmöglichkeit aufgezeigt. Im Zweiten Post hätte ich gerne einen Ausschnitt aus der CSV-Datei geliefert, aber da war ich zu Hause und die Datei im Büro. Und am iPad lässt sich relativ schlecht eine entsprechende Datei erzeugen. Daher auch nur die 5 Beispielzeilen. Ich hoffe, du verzeihst mir.

Übrigens: Die Lösung mit Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None)) hatte ich natürlich als erste Verbesserung getestet. Aber dann bleibt nur die erste Spalte übrig und alle anderen werden verschluckt - zumindest bei mir.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#7
Zitat: Die Lösung mit Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None)) hatte ich natürlich als erste Verbesserung getestet. Aber dann bleibt nur die erste Spalte übrig und alle anderen werden verschluckt - zumindest bei mir.
Die Lösung funktioniert bei mir mit "meinen" Daten und meiner Excel Version ohne Probleme. Womit wir wieder beim Thema "fehlende Datei / Beispieldaten" sind. 

Na dann weiterhin viel Erfolg.
Antworten Top
#8
Hi,

bin schon wieder zu Hause. Aber morgen gibt es die CSV-Datei - inklusive PowerBI-Datei. Versprochen!🤞
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#9
Hi,

hier wie versprochen die Beispiel-Datei, so wie sie jetzt ist. In PowerQuery bitte die Parameter RootPath und SubPath auf euren Pfad anpassen.

Es sind zwei Abfragen enthalten. einmal als Text einlesen und dann Spalten trennen. Und einmal als CSV einlesen.

Die Auswirkung der unterschiedlichen Methoden kann man in der pbix-Datei sehen.


Angehängte Dateien
.zip   CEF.zip (Größe: 193,12 KB / Downloads: 6)
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#10
Das Ergebnis sieht bei mir so aus
   

Die Datei hat so gut mit dem Ausgangsproblem nicht so viel zu tun, neben den Quote Zeichen, müssen Leerzeilen und Leerspalten entfernt werden

Der M-Code funktioniert 1:1 bei mir in PowerBi
   
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste