29.07.2024, 18:54 (Dieser Beitrag wurde zuletzt bearbeitet: 29.07.2024, 18:57 von HKindler.)
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.
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.
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!
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
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.
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.
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.