Power Query - CSV einlesen ohne Quote-Zeichen
#11
Hi Warkings,

du wolltest doch das Original sehen Angel.
Das Problem mit dem Löschen der überflüssigen Zeilen und Spalten ist doch keines, das bekomme ich alleine hin - wie du siehst, wenn du einen Blick in die pbix wirfst.

Ach so, kann natürlich sein, dass du kein PowerBI hast, deshalb habe ich jetzt den PQ-Code noch in eine Excel rüber kopiert.

Und hier die Abfrage, die auf deiner Idee beruht, nochmals als Code.
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),
    #"Liste gespeicherte Header" = Table.Transpose(Table.FromList(List.RemoveItems(Record.ToList(Table.First(#"Entfernte oberste Zeilen")),{"", null}))),
    #"Höher gestufte Header" = Table.PromoteHeaders(#"Entfernte oberste Zeilen", [PromoteAllScalars=true]),
    #"Liste leere Spalten" = List.Select(Table.ColumnNames(#"Höher gestufte Header"), each Text.StartsWith(_, "_") or Text.StartsWith(_, "Column") or _ = ""),
    #"Entfernte Spalten" = Table.RemoveColumns( #"Höher gestufte Header" ,#"Liste leere Spalten"),
    #"Tiefer gestufte Header" = Table.DemoteHeaders(#"Entfernte Spalten"),
    #"Gespeicherte Header einfügen" = Table.Combine({#"Liste gespeicherte Header", #"Tiefer gestufte Header"}),
    #"Höher gestufte Header1" = Table.PromoteHeaders(#"Gespeicherte Header einfügen", [PromoteAllScalars=true]),
    #"Entfernte oberste Zeilen1" = Table.Skip(#"Höher gestufte Header1",1),
    #"Spaltennamen trimmen" = Table.TransformColumnNames(#"Entfernte oberste Zeilen1", Text.Trim),
    #"Gefilterte Zeilen1" = Table.SelectRows(#"Spaltennamen trimmen", each [Banf] <> null and [Banf] <> ""),
    #"Ersetzter Wert" = Table.ReplaceValue(#"Gefilterte Zeilen1","00.00.0000","",Replacer.ReplaceText,{"Banf", "Pos.", "AnfDatum", "Angel.von", "BArt", "Frg", "Material", "Kurztext", "Anforderungsmenge", "ME", "Bewertpreis", "Währg", "pro", "ME_1", "Gesamtwert bei Freigabe", "Währg_2", "Lfd", "K", "Genehmigende Kostenstelle", "Kostenst.", "Auftrag", "Sachkonto", "Infosatz", "Werk", "LOrt", "BedarfsNr.", "Warengruppe", "EKG", "Wunschlief", "Fst.Lief", "EkOr", "Bestellung", "Pos._3", "BestDatum", "Lieferdatum", "Erl"}),
    #"Geänderter Typ" = Table.TransformColumnTypes(#"Ersetzter Wert",{{"Banf", type text}, {"Pos.", type text}, {"AnfDatum", type date}, {"Angel.von", type text}, {"BArt", type text}, {"Frg", type text}, {"Material", type text}, {"Kurztext", type text}, {"Anforderungsmenge", type number}, {"ME", type text}, {"Bewertpreis", type number}, {"Währg", type text}, {"pro", Int64.Type}, {"ME_1", type text}, {"Gesamtwert bei Freigabe", type number}, {"Währg_2", type text}, {"Lfd", type text}, {"K", type text}, {"Genehmigende Kostenstelle", type text}, {"Kostenst.", type text}, {"Auftrag", type text}, {"Sachkonto", type text}, {"Infosatz", type text}, {"Werk", type text}, {"LOrt", type text}, {"BedarfsNr.", type text}, {"Warengruppe", type text}, {"EKG", type text}, {"Wunschlief", type text}, {"Fst.Lief", type text}, {"EkOr", type text}, {"Bestellung", type text}, {"Pos._3", type text}, {"BestDatum", type date}, {"Lieferdatum", type date}, {"Erl", type text}})
in
    #"Geänderter Typ"
Der andere Code zum direkten (fehlerhaften) Einlesen der CSV ist bis auf die ersten zwei Zeilen identisch. daher hier nur die ersten Zeilen:
Code:
let
    Quelle = Csv.Document(File.Contents(RootPath & SubPath & "ZMM_PR_REL.txt"),[Delimiter="#(tab)", Columns=54, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Entfernte oberste Zeilen" = Table.Skip(Quelle,4),


Angehängte Dateien
.xlsx   BANF.xlsx (Größe: 950,48 KB / Downloads: 3)
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#12
Ja, wollte ich und sehe folgendes 
   

Ich lösche leere Spalten anders
   
Und ich habe PowerBi und habe doch geschrieben, dass der M-Code 1:1 in PowerBi funktioniert

PS Und was Du falsch machst bei der Zeile
Code:
= Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None),100)

ist doch auch klar
Antworten Top
#13
Hallo Helmut,

ich habe auch mal ein bißchen im PQ-Code rumgewühlt (siehe: ZMM_PR_REL_2)
- nach dem Laden sofort die ersten überflüssigen Zeilen entfernen
- die 1. Zeile ist jetzt die Überschriftenzeile
- daraus wird die Spaltenanzahl ermittelt
- und noch 1 paar Kleinigkeiten

Gruß von Luschi
aus klein-Paris


Angehängte Dateien
.zip   BANF.zip (Größe: 239,96 KB / Downloads: 2)
[-] Folgende(r) 1 Nutzer sagt Danke an Luschi für diesen Beitrag:
  • HKindler
Antworten Top
#14
@Luschi: bin mittlerweile wieder zu Hause. Werde mir deine Datei morgen anschauen.

@Warkings:
Sorry, deinen letzten Satz hatte ich übersehen.

So gerne ich lernen würde, wie du die überflüssigen Spalten löschst: nur die Bezeichnung der Schritte hilft mir nicht wirklich weiter…

Und nein, mir ist nicht klar, was ich bei der genannten Zeile falsch mache. Was ist es denn? Meinst du die 100 am Ende? Wenn ich die weg lasse, dann erhalte ich sowohl in PBi als auch in Excel nur die erste Spalte. Und ich verwende absichtlich zu viele Spalten, da SAP eine sehr eigene Vorstellung davon hat, wie man eine Text-Datei ausgibt.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#15
Hallo Helmut,

hier schon mal der M-Code:

Testseite für VBA-Umsetzung nach HTML
[Cc][+][-]


let
nix = null,
Quelle = Table.FromColumns({Lines.FromBinary(File.Contents(RootPath & SubPath & "ZMM_PR_REL.txt"), null, _
      null, 1252)}),
#"Entfernte oberste Zeilen" =  Table.Skip(Quelle, each Text.Start(Text.Trim(Text.Clean([Column1])), 4) _
            <> "Banf"),
#"Anzahl Spalten" = List.Count(Text.Split(#"Entfernte oberste Zeilen"[Column1]{0}, "#(tab)")),
#"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Entfernte oberste Zeilen", "Column1",
Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None), #"Anzahl Spalten"),
#"Liste gespeicherte Header" = Table.Transpose(
Table.FromList(
List.RemoveItems(
Record.ToList(
Table.First(#"Spalte nach Trennzeichen teilen")),{"", null}))),
#"Höher gestufte Header" = Table.PromoteHeaders(#"Spalte nach Trennzeichen teilen", [PromoteAllScalars=true]) _
        ,
#"Liste leere Spalten" = List.Select(Table.ColumnNames(#"Höher gestufte Header"),
each Text.StartsWith(_, "_") or Text.StartsWith(_, "Column") or _ = ""),
#"Entfernte Spalten" = Table.RemoveColumns( #"Höher gestufte Header" ,#"Liste leere Spalten"),

#"Tiefer gestufte Header" = Table.DemoteHeaders(#"Entfernte Spalten"),
#"Gespeicherte Header einfügen" = Table.Combine({#"Liste gespeicherte Header", #"Tiefer gestufte Header"}) _
              ,
#"Höher gestufte Header1" = Table.PromoteHeaders(#"Gespeicherte Header einfügen", [PromoteAllScalars=true]) _
        ,
#"Entfernte oberste Zeilen1" = Table.Skip(#"Höher gestufte Header1",1),
#"Spaltennamen trimmen" = Table.TransformColumnNames(#"Entfernte oberste Zeilen1", Text.Trim),
#"Gefilterte Zeilen1" = Table.SelectRows(#"Spaltennamen trimmen", each [Banf] <> null and [Banf] <> "") _
            ,
/*
#"Ersetzter Wert" = Table.ReplaceValue(#"Gefilterte Zeilen1","00.00.0000","",Replacer.ReplaceText,
{"Banf", "Pos.", "AnfDatum", "Angel.von", "BArt", "Frg", "Material", "Kurztext", "Anforderungsmenge", _
        "ME",
"Bewertpreis", "Währg", "pro", "ME_1", "Gesamtwert bei Freigabe", "Währg_2", "Lfd", "K", "Genehmigende Kostenstelle", _
             
"Kostenst.", "Auftrag", "Sachkonto", "Infosatz", "Werk", "LOrt", "BedarfsNr.", "Warengruppe", "EKG", _
            "Wunschlief",
"Fst.Lief", "EkOr", "Bestellung", "Pos._3", "BestDatum", "Lieferdatum", "Erl"}),
*/
#"Ersetzter Wert" = Table.ReplaceValue(#"Gefilterte Zeilen1","00.00.0000","",Replacer.ReplaceText,
Table.ColumnNames(#"Gefilterte Zeilen1")),
#"Geänderter Typ" = Table.TransformColumnTypes(#"Ersetzter Wert",
{{"Banf", type text}, {"Pos.", type text}, {"AnfDatum", type date}, {"Angel.von", type text}, {"BArt", _
          type text},
{"Frg", type text}, {"Material", type text}, {"Kurztext", type text}, {"Anforderungsmenge", type number}, _
       
{"ME", type text}, {"Bewertpreis", type number}, {"Währg", type text}, {"pro", Int64.Type}, {"ME_1", _
      type text},
{"Gesamtwert bei Freigabe", type number}, {"Währg_2", type text}, {"Lfd", type text}, {"K", type text}, _
           
{"Genehmigende Kostenstelle", type text}, {"Kostenst.", type text}, {"Auftrag", type text}, {"Sachkonto", _
              type text},
{"Infosatz", type text}, {"Werk", type text}, {"LOrt", type text}, {"BedarfsNr.", type text},
{"Warengruppe", type text}, {"EKG", type text}, {"Wunschlief", type text}, {"Fst.Lief", type text},
{"EkOr", type text}, {"Bestellung", type text}, {"Pos._3", type text}, {"BestDatum", type date}, {"Lieferdatum", _
        type date},
{"Erl", type text}
})

in
#"Geänderter Typ"

viele Grüße von
L u s c h i  aus klein-Paris
[-] Folgende(r) 1 Nutzer sagt Danke an Luschi für diesen Beitrag:
  • HKindler
Antworten Top
#16
Nehmen wir mal an, dass die Datei jetzt die endgültige Version ist, was spricht dagegen, erst die unnötigen Zeilen und Leerzeilen zu entfernen und dann zu splitten?

Oder welchen Grund gibt es Table.SplitColumn gleich als zweiten Schritt einzufügen?
Antworten Top
#17
Da spricht absolut nichts dagegen. Ist halt so entstanden, da ich zunächst mit dem csv-Import gestartet bin und dort dann gleich die Spalten da sind. Somit war es am einfachsten die alte Struktur zu übernehmen und nur die erste Zeile zu ändern.

Dank Luschi weiß ich jetzt auch, wie ich im Vorfeld die Anzahl der nötigen Spalten bestimmen kann. Muss ich mir morgen nochmals im Einzelnen anschauen.

Übrigens bist du mir noch einige Antworten schuldig: was ist nun an meinem Table.SplitColumn() falsch? Und was verbirgt sich hinter deinen 3 Schritten zum Spalten entfernen? Schließlich möchte ich dazu lernen!
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#18
Du weisst nach den Hinweisen noch immer nicht was falsch ist 🤷‍♂️

Und ich bin hier keinem was schuldig. 
Du warst die Beispieldatei / -daten schuldig und hast nur zögerlich geliefert und dann nur die halbe Wahrheit.

Aber wenn Du meinst

Zitat:... beschwere mich über fehlende Dateien - wenn dies angebracht ist. Allerdings dachte ich, dass ich mein Problem anschaulich genug beschrieben hätte ...


Und "Spalten zu entfernen", google hilft.


Viel Glück!
Antworten Top
#19
Ich befürchte reden furchtbar aneinander vorbei.

In Bezug auf „falsch“ stehe ich vermutlich auf dem Schlauch. Denn es funktioniert und das einzige, was „falsch“ sein könnte, ist die Tatsache, dass ich 100 Spalten bekomme, weil vor Luschis Beitrag keine Ahnung hatte, wie ich die (eventuell wechselnde) korrekte Anzahl an Spalten erhalten kann. Die zusätzlichen Spalten stören mich nicht, da auch zwischendurch ein paar leere Spalten sind. Die Przedur, die diese Spalten entfernt, entfernt auch die zusätzlichen Spalten gleich mit.

Wenn es das ist, dann lass gut sein und behalt dein Geheimnis für dich.

Gleiches gilt auch dafür, dass du nicht verraten willst, wie deiner Meinung nach Spalten korrekt entfernt werden. Wieso brauchst du dafür 3 Schritte? Wenn du meine Datei angeschaut hast, dann hast du gesehen, dass ich das problemlos selbst hinbekomme, indem ich die zu löschenden Spalten ermittle und dann diese lösche. Insgesamt stecken da noch ein paar andere Überlegungen drin, aber die möchte ich jetzt nicht ausführen.

Irgendwie Schade. Ich dachte das Forum wäre dazu da anderen zu helfen (was du mit deinem ersten Beitrag dankenswerterweise auch getan hast - so stelle ich mir Hilfe vor). Aber seither kam leider nichts Konkretes mehr von dir sondern nur vage Andeutungen. Wie gesagt: Schade!

Und zur fehlenden Beispieldatei: meine ursprüngliche Frage war kurz gefasst: „wie kann man erreichen, dass beim Einlesen einer csv-Datei die Anführungszeichen nicht als Textqualifier angesehen werden?“
Ok, so hätte ich es von Anfang an formulieren sollen. Mea culpa.
Braucht es für so eine Frage wirklich eine Datei?
Dass diese Datei erst so spät kam, ist einfach dem Umstand geschuldet, dass die Datei im Büro ist und ich selbst immer erst mal Zugriff darauf haben musste.

Wie gesagt: die ursprüngliche Frage wurde bereits mit deinem ersten Beitrag zu meiner Zufriedenheit gelöst. Nochmals danke dafür! Seither versuche ich nur noch etwas dazu zu lernen, so dass ich für künftige Projekte effizienter arbeiten kann. In dieser Hinsicht hat Luschi mir mit seiner letzten Antwort deutlich mehr beigebracht, da ich einige Ideen sehe, die ich verwenden kann, wie z.B. die korrekte Spaltenzahl im Vorfeld zu ermitteln oder die Verwendung von Table.ColumnNames statt alle Spalten aufzuzählen.

Nochmals: ich suche hier keine fertigen Lösungen, sondern eher geschickte Vorgehensweisen oder auch Tipps und Tricks. Apropos, gibt es bei PQ auch so etwas wie die F1-Taste im VBA-Editor?
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#20
Die Zeit für das Schreiben des Beitrags hättest Du wie folgt verwenden können.

Dieser Idiot   19  Warkings fragt: 
Zitat:...  was spricht dagegen, erst die unnötigen Zeilen und Leerzeilen zu entfernen und dann zu splitten?...
Ja, was passiert, wenn ich erst die unnötigen Zeilen und Leerzeilen zu entferne und die Position der Zeile bzw. den Schritt
Code:
Table.SplitColumn ...

verschiebe. Dann hat SplitColumn nämlich die Chance automatisch zu erkennen, um wieviele Spalten bzw. Delimiter es überhaupt geht. 
In einem meiner Screenshots sieht man es auch 
   

Das zu Deiner Aussage
Zitat:Übrigens: Die Lösung mit Table.SplitColumn(Quelle, "Column1", Splitter.SplitTextByDelimiter("#(tab)", QuoteStyle.None)) hatte ich natürlich als erste Verbesserung getestet. 

Und Deine Aussage
Zitat:... Ich habe eine CSV-Datei (SAP-Export), bei der keine Quote-Zeichen verwendet werden.  ...
ist einfach falsch. 
Force Power Query to Import as a Text File (excelguru.ca)
Zitat:CSV file will contain a list of Comma Separated Values, one record per line, followed by a new line character.  Awesome… until some bright spark decides to inject a line or two of information above the CSV contents which doesn’t contain any commas.


PS Das Löschen der überflüssigen Spalten hast Du ja inzwischen vielleicht schon per Google gefunden.
Antworten Top


Gehe zu:


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