30.08.2022, 12:38
Hallo Ihr Wissenden,
derzeit arbeite ich an einer Aufgabe, aus einem Verzeichnis bestimmte Dateien (alles ASCII) zu laden, Daten daraus zu extrahieren und alles in einer Tabelle gesammelt zur Verfügung zu haben (nachfolgend: die "Sammlung").
Es handelt sich dabei um derzeit über 11000 Dateien, die den Kriterien formal genügen.
Da ständig neue Dateien hinzukommen (werktäglich durchaus auch schon mal >10), gehe ich so vor, dass ich sowohl den aktuellen Dateibestand in PQ abfrage (--> Zugriff auf das Netz-Laufwerk), als auch die schon ausgewerteten Dateien aus der Sammlung einlese (--> Zugriff auf die XL-Tabelle). Anschließend vergleiche ich die beiden Tabellen und nur für die Dateien, die neu hinzugekommen sind, führe ich die Funktion aus, den Dateiinhalt jeweils auszulesen und in die Tabelle einzufügen (sonst müsste ich das jedes Mal für die 11000+ Dateien machen, bald sind's 12000). Soweit zur Ausgangslage.
Um vergleichen zu können:
Für die Aufteilung in "Neu" und "Alt" dachte ich mir nun, dass es doch effizienter sei, zwei Tabellen mit jeweils derselben Anzahl an Zeilen wie die Gesamttabelle zu erzeugen, aber nur einer Spalte mit überall 1 resp. 0.
Mit einem Table.Join(, "Vergleich", , "Column1", JoinKind.LeftOuter) füge ich nun meine "1"-Tabelle und die zu teilende Tabelle zusammen --> das sollte meiner Erwartung nach nur die Zeilen übrig lassen, die in der zu teilenden Tabelle in der Vergleichsspalte auch = 1 sind. (Die o.g. Alternative tut's - aber die Vermutung war, da es sich beim Table.Join um eine 'native' Datenbankoperation handelt, dass das effektiver sei als in allen 11000+ Zeilen den 'händischen' Vergleich auszuführen)
Nun erhalte ich aber statt der erwarteten Aufspaltung eine völlig unübersichtliche Art Kreuztabelle - keine Ahnung, warum.
Kann mir jemand hier 'auf die Sprünge helfen' ?
Nachfolgend der relevante Auszug aus dem PQ-Script:
Gruß und Dank,
RaiSta
derzeit arbeite ich an einer Aufgabe, aus einem Verzeichnis bestimmte Dateien (alles ASCII) zu laden, Daten daraus zu extrahieren und alles in einer Tabelle gesammelt zur Verfügung zu haben (nachfolgend: die "Sammlung").
Es handelt sich dabei um derzeit über 11000 Dateien, die den Kriterien formal genügen.
Da ständig neue Dateien hinzukommen (werktäglich durchaus auch schon mal >10), gehe ich so vor, dass ich sowohl den aktuellen Dateibestand in PQ abfrage (--> Zugriff auf das Netz-Laufwerk), als auch die schon ausgewerteten Dateien aus der Sammlung einlese (--> Zugriff auf die XL-Tabelle). Anschließend vergleiche ich die beiden Tabellen und nur für die Dateien, die neu hinzugekommen sind, führe ich die Funktion aus, den Dateiinhalt jeweils auszulesen und in die Tabelle einzufügen (sonst müsste ich das jedes Mal für die 11000+ Dateien machen, bald sind's 12000). Soweit zur Ausgangslage.
Um vergleichen zu können:
- führe ich einen Table.Join auf
- einerseits das Ergebnis der Verzeichnisabfrage und
- andererseits das Ergebnis der Sammlungsabfrage durch
- mit dem Schlüsselfeld "Dateiname" --> das klappt auch soweit problemlos
- füge eine weitere Spalte "Vergleich" an, in der ich jeweils 1 (falls neu) oder 0 (schon bekannt) eintrage ("Gesamttabelle", "zu teilende Tabelle")
- teile die Tabelle auf in eine "Neu" --> muss zerlegt werden (d.h. in der Spalte "Vergleich" steht 1) und eine "Alt", mit der erst mal nix mehr passieren muss
- diese Aufteilung via Table.SelectRows(
, each ([Vergleich] = 1) - und füge nach Zerlegung der neuen letztendlich beide Tabellen wieder zusammen, bevor die Sammlung in der XL-Tabelle aktualisiert (d.h.: überschrieben) wird
Für die Aufteilung in "Neu" und "Alt" dachte ich mir nun, dass es doch effizienter sei, zwei Tabellen mit jeweils derselben Anzahl an Zeilen wie die Gesamttabelle zu erzeugen, aber nur einer Spalte mit überall 1 resp. 0.
Mit einem Table.Join(
Nun erhalte ich aber statt der erwarteten Aufspaltung eine völlig unübersichtliche Art Kreuztabelle - keine Ahnung, warum.
Kann mir jemand hier 'auf die Sprünge helfen' ?
Nachfolgend der relevante Auszug aus dem PQ-Script:
Code:
// in der Tabelle "Neu+Alt" sind Laufwerk-Abfrage und Tabellen-Abfrage 'ge-Joint'
// nun die Vergleichs-Spalte bilden für Alt gegen Neu
// (Datei-Datum hat mehr als 1 Sekunde Unterschied (d.h. die Datei wurde zwischenzeitlich verändert) oder
// der Dateiname (aus dem Laufwerk) hat keine Entsprechung in der XL-Tabelle)
Vergleich = Table.AddColumn(#"Neu+Alt", "Vergleich", each if
(Number.Abs(Number.From([DateiDatum]-[ModifyDateandTime]))>1/24/3600 or [Name]=null)
then 1 else 0),
ZeilenZahl = Table.RowCount(Vergleich), //Anzahl aller Einträge der Vergleichs-Tabelle
ZeilenZahl2Modify=List.Sum(Vergleich[Vergleich]), //Anzahl der Neu-Einträge
ZeilenZahlAlt=ZeilenZahl - ZeilenZahl2Modify, //Differenz=Anzahl vorhandener Einträge
// es wird aus der Spalte mit Dateinamen (aus Laufwerk) und der Spalte Namen (aus XL-Tabelle) eine neue Spalte "Namen" gebildet
// für die spätere Verwendung
NamenZusammenfügen = Table.RenameColumns(
Table.RemoveColumns(
Table.AddColumn(Vergleich, "Name1", each
try if Text.Length([Name])>0 then [Name] else [DateiName] otherwise [DateiName]),
{"Name"}),
{{"Name1","Name"}}),
//Die "1"-Tabelle
ListeMit1=List.Buffer(List.Repeat({1},ZeilenZahl)), //Eine Liste mit "1" zum schnelleren Extrahieren der zu bearbeitenden Dateien per Table.Join
TabelleMit1 = Table.Buffer(Table.FromList(ListeMit1, Splitter.SplitByNothing(), null, null, null)),
//Die "0"-Tabelle
ListeMit0 = List.Buffer(List.Repeat({0},ZeilenZahl)), //Eine Liste mit "0" ... um die bestehenden Dateien zu ermitteln per Table.Join
TabelleMit0 = Table.Buffer(Table.FromList(ListeMit0, Splitter.SplitByNothing(), null, null, null)),
//Die Liste noch zu bearbeitender Dateien
// Variante 1 mit Table.Join
TabOffen=Table.Join(ZeilenZahl,"Vergleich",TabelleMit1,"Column1", JoinKind.LeftOuter),
// Variante 2 "klassisch"
zuBearbeiten = Table.SelectRows(NamenZusammenfügen, each ([Vergleich] = 1)),
Gruß und Dank,
RaiSta