Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

PQ: CSV einlesen, mehrere Trennzeichen als ein Zeichen
#1
Hi,

wenn ich in Excel eine CSV einlesen will, die als Trennzeichen mehrere Leerzeichen verwendet, dann kann ich die einfach per Doppelklick öffnen. Dabei landet alles in Spalte A und ich muss das mit "Text in Spalten" auf die Spalten verteilen. Dabei kann ich den Haken bei "Leerzeichen" und "Aufeinander folgende Trennzeichen als ein Zeichen behandeln" setzen und alles wird wunderbar eingelesen. Problem: sind in der Spalten-Überschrift Leerzeichen, wird da auch getrennt. Alternativ könnte ich auch "feste Breite" setzen und die Spalten händisch aufteilen, das ist aber dann viel Handarbeit. Und ich habe das Problem, dass die Datei UTF-8 kodiert ist und daher Umlaute zwei Zeichen beanspruchen, so dass die Überschriften irgendwann in die nächste Spalte reinragen.

Da ich noch mehrere Datei der selben Art erwarte, wollte ich das Ganze per PQ machen. Dort kann ich auch wunderbar UTF-8 als Kodierung einstellen. Ebenso das Leerzeichen als Trennzeichen. Aber ich finde keine Möglichkeit mehrere Trennzeichen zusammenzufassen. Geht das mit PQ nicht?

Im Anhang eine Beispiel-CSV


Angehängte Dateien
.csv   Beispiel.csv (Größe: 2,78 KB / Downloads: 10)
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#2
Hallo

In PQ evtl. so bearbeiten. 
Pfad anpassen.
Code:
let
    Quelle = Csv.Document(File.Contents("C:\Users\Beispiel.csv"),1,{0},null,1252),
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Column1", type text}}),
    #"Ersetzter Wert" = Table.ReplaceValue(#"Geänderter Typ","***","""",Replacer.ReplaceText,{"Column1"}),
    #"Ersetzter Wert1" = Table.ReplaceValue(#"Ersetzter Wert","Date_Time","Date Time",Replacer.ReplaceText,{"Column1"}),
    #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Ersetzter Wert1", "Column1", Splitter.SplitTextByWhitespace()),
    #"Höher gestufte Header" = Table.PromoteHeaders(#"Spalte nach Trennzeichen teilen", [PromoteAllScalars=true]),
    #"Geänderter Typ1" = Table.TransformColumnTypes(#"Höher gestufte Header",{{"Teil", type text}, {"Fläche", type number}, {"DRM_1", type number}, {"POS_1", type number}, {"Info X Position", type number}, {"Info Y Position", type number}, {"Hülldurchmesser", type number}, {"Pferchdurchmesser", type number}, {"Rundheit", type number}, {"Date", type date}, {"Time", type time}})
in
    #"Geänderter Typ1"
Gruß Elex
Antworten Top
#3
Moin Helmut

Da es ja keine "echte" CSV habe ich es mit TEXT und Splitten nach Positionen versucht.
Bitte beachten: PQ arbeitet 0-basiert.

Code:
let
    Source = Table.FromColumns({Lines.FromBinary(File.Contents("D:\Beispiel.csv"), null, null, 65001)}),
    #"Split Column by Positions" = Table.SplitColumn(Source, "Column1", Splitter.SplitTextByPositions({0, 5, 12, 18, 24, 46, 68, 84, 102, 115}), {"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9", "Column1.10"}),
    #"Promoted Headers" = Table.PromoteHeaders(#"Split Column by Positions", [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{"Teil ", type text}, {"Fläche ", type number}, {"DRM_1 ", type number}, {"POS_1 ", type number}, {"***Info X Position*** ", type number}, {"***Info Y Position*** ", type number}, {"Hülldurchmesser ", type number}, {"Pferchdurchmesser ", type number}, {"Rundheit    ", type number}, {"Date_Time", type datetime}})
in
    #"Changed Type1"
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

[-] Folgende(r) 1 Nutzer sagt Danke an shift-del für diesen Beitrag:
  • PIVPQ
Antworten Top
#4
Hi Elex,

viele Dank. mein Versuch sah so aus:
Code:
let
    Quelle = Csv.Document(File.Contents("D:\Beispiel.csv"),[Delimiter=",", Columns=9, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}})
in
    #"Geänderter Typ"
Hier habe ich ich keine Lösung gefunden, mehrere Leerzeichen zusammenzufassen. Und ich hatte keine Idee, wie ich Leerzeichen in den Überschriften beibehalten soll.

Deine Idee, die *** durch Anführungszeichen zu ersetzen ist genial!
Da ich Datum / Uhrzeit als einen Wert haben will und du vergessen hattest, dass die Datei als UTF-8 vorliegt, habe ich deinenn Code noch etwas geändert...
Code:
let
    Quelle = Csv.Document(File.Contents("D:\Beispiel.csv"),1,{0},null,65001),
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Column1", type text}}),
    #"Ersetzter Wert" = Table.ReplaceValue(#"Geänderter Typ","***","""",Replacer.ReplaceText,{"Column1"}),
    #"Ersetzter Wert1" = Table.ReplaceValue(#"Ersetzter Wert","Date_Time","Date Time",Replacer.ReplaceText,{"Column1"}),
    #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Ersetzter Wert1", "Column1", Splitter.SplitTextByWhitespace()),
    #"Zusammengeführte Spalte eingefügt" = Table.AddColumn(#"Spalte nach Trennzeichen teilen", "Date_Time", each Text.Combine({[Column1.10], [Column1.11]}, " "), type text),
    #"Neu angeordnete Spalten" = Table.ReorderColumns(#"Zusammengeführte Spalte eingefügt",{"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9", "Column1.10", "Column1.11", "Date_Time", "Column1.12"}),
    #"Entfernte Spalten" = Table.RemoveColumns(#"Neu angeordnete Spalten",{"Column1.10", "Column1.11"}),
    #"Höher gestufte Header" = Table.PromoteHeaders(#"Entfernte Spalten", [PromoteAllScalars=true]),
    #"Geänderter Typ" = Table.TransformColumnTypes(#"Höher gestufte Header",{{"Teil", type text}})
in
    #"Geänderter Typ"
Das Table.SplitColumn(#"Ersetzter Wert1", "Column1", Splitter.SplitTextByWhitespace()) kann man sich aber nicht zusammenklicken. Das muss man wissen oder? Woher bekommt man solches Wissen, ohne das Handbuch (welches?) auswendig zu lernen?

Du merkst in PQ bin ich einfach noch im Stadium des Anfängers...
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#5
In VBA:
Code:
Sub M_snb()
  With ActiveSheet.QueryTables.Add("TEXT;J:\download\Beispiel.csv", Range("$A$35"))
    .Name = "Snb"
    .FieldNames = True
    .AdjustColumnWidth = True
    .TextFilePlatform = 65001
    .TextFileParseType = 2
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    .TextFileFixedColumnWidths = Array(5, 7, 5, 6, 22, 23, 16, 18, 13)
    .TextFileTrailingMinusNumbers = True
    .Refresh False
  End With
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#6
Hi Detlef,

auch nicht schlecht, vor allem etwas kürzer und wirklich voll zusammenklickbar. Allerdings etwas umständlicher, da man die Split-Positionen ermitteln muss. Ist mir aufgefallen, da ich in der Beispieldatei die letzte Spalte (Materialnummer) weg gelassen hatte, ich allerdings deinen Code mit dem Original getestet habe. Dadurch hatte ich eine Spalte mit Datum, Zeit und MatnNr. aber das Problem war schnell behoben. Die Lösung von Elex ist mir von daher sympatischer.

Hi snb,

auch wie immer eine kurze, prägnante Lösung. Aber so sehr ich VBA mag, in diesem Fall will es mit PQ lösen - allein schon, weil ich dies noch lernen will.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#7
Da waren noch ein paar Leerzeichen in Spalte A und in den Überschriften.

Code:
let
    Source = Table.FromColumns({Lines.FromBinary(File.Contents("D:\Beispiel.csv"), null, null, 65001)}),
    #"Split Column by Positions" = Table.SplitColumn(Source, "Column1", Splitter.SplitTextByPositions({0, 5, 12, 18, 24, 46, 68, 84, 102, 115}), {"Column1.1", "Column1.2", "Column1.3", "Column1.4", "Column1.5", "Column1.6", "Column1.7", "Column1.8", "Column1.9", "Column1.10"}),
    #"Promoted Headers" = Table.PromoteHeaders(#"Split Column by Positions", [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{"Teil ", type text}, {"Fläche ", type number}, {"DRM_1 ", type number}, {"POS_1 ", type number}, {"***Info X Position*** ", type number}, {"***Info Y Position*** ", type number}, {"Hülldurchmesser ", type number}, {"Pferchdurchmesser ", type number}, {"Rundheit    ", type number}, {"Date_Time", type datetime}}),
    #"Trimmed Text" = Table.TransformColumns(#"Changed Type1",{{"Teil ", Text.Trim, type text}}),
    #"Renamed Columns" = Table.RenameColumns(#"Trimmed Text",{{"Teil ", "Teil"}, {"Fläche ", "Fläche"}, {"DRM_1 ", "DRM_1"}, {"POS_1 ", "POS_1"}, {"***Info X Position*** ", "Info X Position"}, {"***Info Y Position*** ", "Info Y Position"}, {"Hülldurchmesser ", "Hülldurchmesser"}, {"Pferchdurchmesser ", "Pferchdurchmesser"}, {"Rundheit    ", "Rundheit"}})
in
    #"Renamed Columns"
Wir sehen uns!
... Detlef

Meine Beiträge können Ironie oder Sarkasmus enthalten.

Antworten Top
#8
https://learn.microsoft.com/de-de/powerq...-reference
Manchmal hilft einfach nur Probieren. Aus der Beschreibung war auch nicht gleich klar das es so geht. Idea
[-] Folgende(r) 1 Nutzer sagt Danke an Elex für diesen Beitrag:
  • HKindler
Antworten Top


Gehe zu:


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