2016-12-21 3 views
0

Ich möchte mehrere Textdateien aus einem Ordner, jede Datei mit zwei Spalten, in eine einzige Excel-Tabelle, so dass jede neue Datei zu importieren beginnt in einer neuen Spalte. Idealerweise benötige ich die zwei Spalten aus der ersten Datei und nur die zweite Spalte aus jeder zusätzlichen Textdatei. In powerquery habe ich versucht, die "Importieren von Ordner (Importieren von Metadaten und Links über Dateien in einem Ordner)" -Funktion, gefolgt von Abfrage-Editor und das Erweitern der Binärdateien und das Ergebnis war, dass jede neue Datei am Ende des vorherigen angehängt wurde ein. Aber ich möchte, dass jede Datei eine neue Spalte im selben Blatt startet und ich weiß nicht, wie ich das machen soll.Powerquery: Wie importiere ich mehrere Textdateien aus einem Ordner in separaten Spalten in der Excel-Tabelle

Wie kann ich Powerquery dazu veranlassen? Vielen Dank im Voraus für Ihre Hilfe!

Antwort

1

Mein Vorschlag enthält zwei ziemlich schwierige Schritte, die über den erweiterten Editor hinzugefügt wurden, aber er ist dynamisch im Hinblick auf die Anzahl der TXT-Dateien im Ordner. Ich habe eine Menge Kommentare hinzugefügt, so dass es selbsterklärend sein sollte.

/* In this query, .txt files from a folder are combined. 
Each source file has 2 columns. 
The resulting table consists of both columns from the first file and each second column from the other files. 
Tables are joined using each first column as key and with a left outer join 
It is assumed that each file has column headers in the first row, that the first column header is the same for each file 
    and, preferably, the second column header differs per file, although this is not necessary. 
This query is tested with the following file contents: 

File1.txt: 
    ID,File1 
    1,A 
    2,B 
    3,C 
    4,D 

File2.txt: 
    ID,File2 
    1,W 
    2,X 
    3,Y 

Another file was added later on, to test for .txt files being added to the folder: works fine! 
*/  

let 
// Standard UI: 
Source = Folder.Files("C:\Users\Marcel\Documents\Forum bijdragen\StackOverflow Power Query\Multiple files in 1 folder"), 

// Standard UI; step renamed 
FilteredTxt = Table.SelectRows(Source, each [Extension] = ".txt"), 

// Standard UI; step renamed 
RemovedColumns = Table.RemoveColumns(FilteredTxt,{"Name", "Extension", "Date accessed", "Date modified", "Date created", "Attributes", "Folder Path"}), 

// UI add custom column "FileContents" with formula Csv.Document([Content]); step renamed 
AddedFileContents = Table.AddColumn(RemovedColumns, "FileContents", each Csv.Document([Content])), 

// Standard UI; step renamed 
RemovedBinaryContent = Table.RemoveColumns(AddedFileContents,{"Content"}), 

// In the next 3 steps, temporary names for the new columns are created ("Column2", "Column3", etcetera) 
// Standard UI: add custom Index column, start at 2, increment 1 
#"Added Index" = Table.AddIndexColumn(RemovedBinaryContent, "Index", 2, 1), 

// Standard UI: select Index column, Transform tab, Format, Add Prefix: "Column" 
#"Added Prefix" = Table.TransformColumns(#"Added Index", {{"Index", each "Column" & Text.From(_, "en-US"), type text}}), 

// Standard UI: 
#"Renamed Columns" = Table.RenameColumns(#"Added Prefix",{{"Index", "ColumnName"}}), 
// Now we have the names for the new columns 

// Advanced Editor: create a list with records with FileContents (tables) and ColumnNames (text) (1 list item (or record) per txt file in the folder) 
// From this list, the resulting table will be build in the next step. 
ListOfRecords = Table.ToRecords(#"Renamed Columns"), 

// Advanced Editor: use List.Accumulate to build the table with all columns, 
// starting with Column1 of the first file (Table.FromList(ListOfRecords{0}[FileContents][Column1], each {_}),) 
// adding Column2 of each file for all items in ListOfRecords. 
BuildTable = List.Accumulate(ListOfRecords, 
          Table.FromList(ListOfRecords{0}[FileContents][Column1], each {_}), 
          (TableSoFar,NewColumn) => 
           Table.ExpandTableColumn(Table.NestedJoin(TableSoFar, "Column1", NewColumn[FileContents], "Column1", "Dummy", JoinKind.LeftOuter), "Dummy", {"Column2"}, {NewColumn[ColumnName]})), 

// Standard UI 
#"Promoted Headers" = Table.PromoteHeaders(BuildTable) 

in 

    #"Promoted Headers" 
Verwandte Themen