Quelle: https://supportnet.de/forum/2538461/mehrere-dateien-Tabelle-zusammenfuhren-spalten-aneinander
Stand: 26.12.2024 13:00
Hier der Eröffnungsbeitrag aus dem Forum:
Mehrere csv Dateien in eine Excel Tabelle zusammenführen – Spalten aneinander reihen
Ich habe viele hunderte csv Dateien (in einem Ordner) aus einem Datensammler, die zusammen geführt werden sollten. Die csv Dateien sind alle gleich aufgebaut, mit zwei Spalten und 450 Reihen. Wobei die erste Spalte immer dieselbe ist und die unterschiedlichen Daten sich in Spalte zwei befinden.
Ich benötige eine Tabelle mit:
der ersten Spalte und aus der (Datei‑1 – Spalte‑1,)
zweite Spalte aus (Datei‑1 – Spalte‑2)
dritte Spalte aus (Datei‑2 – Spalte‑2)
vierte Spalte aus (Datei‑3 – Spalte‑2)
usw.
Hat jemand für dieses Zusammenführen von Spalten (nicht reihen) eine Lösung?
Der Hinweis darauf, dass das mit VBA gelöst werden kann, liegt bereits vor. Und ich denke, dass der Weg für erfahrene Exelaner durchaus gangbar ist, sofern VBA am Arbeitsplatz erlaubt ist. Mich hat es gereizt, das Problem in Power Query zu lösen.
Da (wie so oft in Excel-Foren) keine Musterdaten zur Verfügung gestellt worden sind und auch keine wirklich eindeutige Wunschlösung gegeben ist, bleibt mir nur meine eigene Interpretation und unnötige Mehrarbeit.
Zu Beginn den einen oder anderen Hinweis: Ich habe für mein Beispiel 5 kleinere csv-Files erstellt, welche meiner Meinung nach den Muster-Vorstellungen des Fragestellers entsprechen. Diese Dateien finden Sie hier im Blog auf meinem Server. In dieser zip-Datei ist ausnahmsweise auch die fertige Ausarbeitung als *.xlsx enthalten (es ist ja noch Weihnachten… 😉) aber wenn Sie die von mir erstellteDatei unverändert übernehmen wollen, müssen Sie die csv-Dateien unbedingt unter dem Pfad
C:\Data\1bis5 (csv)\
speichern. Und dort dürfen auch nur diese csv-Files liegen. Wenn Sie ihren eigenen Speicherort verwenden wollen schlage ich Ihnen vor, den Power Query-Import des Verzeichnisses getrennt von Hand vorzunehmen, damit es nicht zu Konflikten kommt. Eine Anpassung von Hand ist unter Umständen recht aufwändig.
Und ja, ich habe (wie recht oft) versucht, das Ganze möglichst gut nachvollziehbar zu gestalten. Auch wenn es hier und da etwas Performance kostet. Erfahrene PQ-User werden gewiss hier und da einen anderen Weg einschlagen aber mein Ziel ist nun einmal, die Transparenz in den Vordergrund zu stellen und damit auch Einsteigern in der Power Query-Welt die Chance zu bieten, daraus zu lernen und darauf auch aufzubauen. Und vielleicht fragen Sie sich ja, warum ich die Abfrage Max Anzahl Datensätze je csv erstellt habe. Angeblich sind es ja immer gleich viel Zeilen in den csv-Dateien. „Angeblich…“ 😉 Aber ich habe zu oft erlebt, dass da doch vielleicht einmal der eine oder andere Ausreißer dabei ist und dann das Ergebnis verfälscht ist.
Die hier aufgeführten M-Codeblöcke sind original aus der zur Verfügung gestellten Datei übertragen worden. Und Sie werden erkennen, dass der Pfad der zu importierenden Dateien nicht nur 1 Mal vorkommt…
M-Code der Hilfsprogrammabfragen
// M-Code: 'Beispieldatei' let Quelle = Folder.Files("C:\Data\1bis5 (csv)"), #"Andere entfernte Spalten" = Table.SelectColumns(Quelle,{"Content", "Name"}), Navigation1 = #"Andere entfernte Spalten"{0}[Content] in Navigation1
// M-Code: 'Parameter1 (Beispieldatei)' Beispieldatei meta [IsParameterQuery=true, BinaryIdentifier=Beispieldatei, Type="Binary", IsParameterQueryRequired=true]
// M-Code 'fx Datei transformieren'
let
Quelle = (Parameter1 as binary) => let
Quelle = csv.Document(Parameter1,[Delimiter=";", Columns=2, Encoding=65001, QuoteStyle=QuoteStyle.None])
in
Quelle
in
Quelle
// 'Beispieldatei transformieren'
let
Quelle = csv.Document(Parameter1,[Delimiter=";", Columns=2, Encoding=65001, QuoteStyle=QuoteStyle.None])
in
Quelle
M-Code des Hauptteils (Andere Abfragen)
// M-Code: 1bis5 csv let Quelle = Folder.Files("C:\Data\1bis5 (csv)"), #"Andere entfernte Spalten" = Table.SelectColumns(Quelle,{"Content", "Name"}), // Geschieht automatisch durch: // Erweitern der Spalte 'Content' durch Klick auf das Doppelpfeil-Symbol #"Gefilterte ausgeblendete Dateien1" = Table.SelectRows(#"Andere entfernte Spalten", each [Attributes]?[Hidden]? <> true), // Passiert automatisch #"Benutzerdefinierte Funktion aufrufen1" = Table.AddColumn(#"Gefilterte ausgeblendete Dateien1", "Datei transformieren", each #"Datei transformieren"([Content])), #"Andere entfernte Spalten1" = Table.SelectColumns(#"Benutzerdefinierte Funktion aufrufen1",{"Name", "Datei transformieren"}), #"Erweiterte Tabellenspalte1" = Table.ExpandTableColumn(#"Andere entfernte Spalten1", "Datei transformieren", Table.ColumnNames(#"Datei transformieren"(Beispieldatei))), // An dieser Stelle die Abfrage duplizieren, um die maximale Anzahl der Datensätze je csv zu berechnen #"Geänderter Typ" = Table.TransformColumnTypes(#"Erweiterte Tabellenspalte1",{{"Column1", type text}, {"Column2", Int64.Type}}) in #"Geänderter Typ"
M-Code: 'Max Anzahl Datensätze je csv' let Quelle = Folder.Files("C:\Data\1bis5 (csv)"), #"Andere entfernte Spalten" = Table.SelectColumns(Quelle,{"Content", "Name"}), // Geschieht automatisch durch: // Erweitern der Spalte 'Content' durch Klick auf das Doppelpfeil-Symbol #"Gefilterte ausgeblendete Dateien1" = Table.SelectRows(#"Andere entfernte Spalten", each [Attributes]?[Hidden]? <> true), // Passiert automatisch #"Benutzerdefinierte Funktion aufrufen1" = Table.AddColumn(#"Gefilterte ausgeblendete Dateien1", "Datei transformieren", each #"Datei transformieren"([Content])), #"Andere entfernte Spalten1" = Table.SelectColumns(#"Benutzerdefinierte Funktion aufrufen1",{"Name", "Datei transformieren"}), #"Erweiterte Tabellenspalte1" = Table.ExpandTableColumn(#"Andere entfernte Spalten1", "Datei transformieren", Table.ColumnNames(#"Datei transformieren"(Beispieldatei))), // An dieser Stelle die Abfrage duplizieren, um die maximale Anzahl der Datensätze je csv zu berechnen #"Geänderter Typ" = Table.TransformColumnTypes(#"Erweiterte Tabellenspalte1",{{"Column1", type text}, {"Column2", Int64.Type}}) in #"Geänderter Typ"
M-Code: 'Nur 1 csv' let Quelle = Folder.Files("C:\Data\1bis5 (csv)"), #"Andere entfernte Spalten" = Table.SelectColumns(Quelle,{"Content", "Name"}), // Geschieht automatisch durch: // Erweitern der Spalte 'Content' durch Klick auf das Doppelpfeil-Symbol #"Gefilterte ausgeblendete Dateien1" = Table.SelectRows(#"Andere entfernte Spalten", each [Attributes]?[Hidden]? <> true), // Passiert automatisch #"Benutzerdefinierte Funktion aufrufen1" = Table.AddColumn(#"Gefilterte ausgeblendete Dateien1", "Datei transformieren", each #"Datei transformieren"([Content])), #"Andere entfernte Spalten1" = Table.SelectColumns(#"Benutzerdefinierte Funktion aufrufen1",{"Name", "Datei transformieren"}), #"Erweiterte Tabellenspalte1" = Table.ExpandTableColumn(#"Andere entfernte Spalten1", "Datei transformieren", Table.ColumnNames(#"Datei transformieren"(Beispieldatei))), // An dieser Stelle die Abfrage duplizieren, um die maximale Anzahl der Datensätze je csv zu berechnen #"Geänderter Typ" = Table.TransformColumnTypes(#"Erweiterte Tabellenspalte1",{{"Column1", type text}, {"Column2", Int64.Type}}), #"Gefilterte Zeilen" = Table.SelectRows(#"Geänderter Typ", each ([Name] = "1.csv")), #"Hinzugefügter Index" = Table.AddIndexColumn(#"Gefilterte Zeilen", "Index", 0, 1, Int64.Type), #"Zusammengeführte Abfragen" = Table.NestedJoin(#"Hinzugefügter Index", {"Index"}, #"2 bis ## csv", {"Modulo"}, "2 bis ## csv", JoinKind.LeftOuter), #"Erweiterte 2 bis ## csv" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "2 bis ## csv", {"2.csv", "3.csv", "4.csv", "5.csv"}, {"2.csv", "3.csv", "4.csv", "5.csv"}), #"Entfernte Spalten" = Table.RemoveColumns(#"Erweiterte 2 bis ## csv",{"Index", "Name"}), #"Umbenannte Spalten" = Table.RenameColumns(#"Entfernte Spalten",{{"Column2", "1.csv"}}) in #"Umbenannte Spalten"
Und hier, beim Stichwort last but not least finden Sie noch einen Hinweis, wo und wie Sie Antworten auf eventuelle Fragen oder auch die ausgearbeitete Datei bekommen können. Grundlegendes zum Thema M-Code lesen Sie hier im Blog nach.