Spalten von CSV Dateien per Batch zusammenfügen
Hi,
ich würde gerne zwei CSV Dateien zusammenfügen. Konkret soll eine Spalte aus der 2.CSV Datei an die 1.CSV Datei angefügt werden.
CSV1:
Spalte A; Spalte B; Spalte C; Spalte D; Spalte E; Spalte F;
CSV2:
Spalte A; Spalte B; Spalte G
Ziel CSV1:
Spalte A; Spalte B; Spalte C; Spalte D; Spalte E; Spalte F; Spalte G;
Ist sowas per PowerShell Batch möglich und wenn ja, wie?
Danke für die Hilfe im Voraus.
ich würde gerne zwei CSV Dateien zusammenfügen. Konkret soll eine Spalte aus der 2.CSV Datei an die 1.CSV Datei angefügt werden.
CSV1:
Spalte A; Spalte B; Spalte C; Spalte D; Spalte E; Spalte F;
CSV2:
Spalte A; Spalte B; Spalte G
Ziel CSV1:
Spalte A; Spalte B; Spalte C; Spalte D; Spalte E; Spalte F; Spalte G;
Ist sowas per PowerShell Batch möglich und wenn ja, wie?
Danke für die Hilfe im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 427769
Url: https://administrator.de/forum/spalten-von-csv-dateien-per-batch-zusammenfuegen-427769.html
Ausgedruckt am: 22.04.2025 um 11:04 Uhr
21 Kommentare
Neuester Kommentar


Naja bisschen Kopf benutzen sollte man schon noch können... Du schreibst ja noch nicht mal welche Spalten (A oder B)die in beiden Files paarweise Werte enthalten, da kann man nur raten welche Zeilen du zusammenfügen willst...

S. Erg.

$csv1 = Import-CSV 'd:\file1.csv' -delimiter ";"
$csv2 = Import-CSV 'd:\file2.csv' -delimiter ";"
$csv1 | select *,@{n='Spalte G';e={$this = $_; $csv2 | ?{$_.'Spalte A' -eq $this.'Spalte A' -and $_.'Spalte B' -eq $this.'Spalte B'} | select -Expand 'Spalte G'}} | export-csv .\datei_neu.csv -delimiter ";" -NoTypeInformation -Encoding UTF8
Tschö ...

Tippfehler.

Nöp hier getestet ...geht einwandfrei.
Viel Spaß noch beim Powershell lernen, ich bin jetzt raus.
Viel Spaß noch beim Powershell lernen, ich bin jetzt raus.
Zitat von @138810:
Interessantes Konstrukt. Muss ich mir in einer ruhigen Minute mal reinziehen. Danke dafür.> $csv1 = Import-CSV 'd:\file1.csv' -delimiter ";"
> $csv2 = Import-CSV 'd:\file2.csv' -delimiter ";"
> $csv1 | select *,@{n='Spalte G';e={$this = $_; $csv2 | ?{$_.'Spalte A' -eq $this.'Spalte A' and $_.'Spalte B' -eq $this.'Spalte B'} | select -Expand 'Spalte G'}} | export-csv .\datei_neu.csv -delimiter ";" -NoTypeInformation -Encoding UTF8
>
Zitat von @thedummy:
Erhalte die selbe Fehlermeldung, allerdings mit dem Hinweis auf die letzte Zeile: $csv1 | select...
na, dass passiert, wenn man sich trotz konkreter Nachfragen, nicht einmal bemüht, ebendiese zu beantworten...Erhalte die selbe Fehlermeldung, allerdings mit dem Hinweis auf die letzte Zeile: $csv1 | select...

Zitat von @Kraemer:
Interessantes Konstrukt. Muss ich mir in einer ruhigen Minute mal reinziehen. Danke dafür.
Da kann ich dir schon mal auf die Sprünge helfen.Interessantes Konstrukt. Muss ich mir in einer ruhigen Minute mal reinziehen. Danke dafür.
Vorgehensweise ist dabei folgende :
Die csv1 wird an Select gepiped, dort werden erst einmal alle Spalten selektiert (*) und mit einer Calculated Property also zusätzlichen Spalte ergänzt. Eine calculated property besteht im Grundsatz aus einer Hashtable mit zwei Eigenschaften, das eine n steht für "Name" und ist eine Abkürzung für den Namen der neuen Eigenschaft . Das e steht als Abkürzung für Expression welche einen Skriptblock enthält in der der Wert für die Eigenschaft festgelegt wird. Alles was in diesem Block ausgegeben wird wird nachher der Inhalt der Eigenschaft.
Darin geschieht jetzt folgendes:
Für jede Zeile der csv1 wird die aktuelle Zeile in der Variablen $this zwischengespeichert weil der Wert in einer anderen Pipe erneut genutzt wird. Dann werden die Zeilen der csv2 mit einem where-object ausgefiltert um die zugehörige Zeile in der csv2 zu ermitteln und dann die gewünschte Spalte ausgegeben. Im Beispiel sind das zwei Spalten die eine Zeile eindeutig identifizieren, das kann man dort beliebig anpassen, z.B. wenn man eine eindeutige Spalte mit einer ID hat, dann reicht der Vergleich einer einzigen Spalte.

ich finde den fehler nicht
Da fehlt bei dir ein Bindestrich vor dem "and".
selbe fehlermeldung
Dann machst du grundlegend was falsch oder verwendest eine vollkommen veraltete PS Version, sorry.Ohne vernünftigen Log und nicht nur so ein ungenaues dahingeschreibsel der Fehlermeldung ohne Screenshots und PS Version etc. kann ich dir nicht weiterhelfen! Da es wie gesagt einwandfrei funktioniert, der FEHLER liegt also bei dir selbst.

Hier siehst du übrigens das es definitiv funktioniert
https://tio.run/##jY/RaoMwFIbv8xQHEYSxOPRqIDJbV8dudtNutyJ61gZiksXYdWif3e ...
Die Import-CSVs sind im Beipiel nur ersetzt durch Demodaten die in den Code integriert wurde, das Ergebnis ist aber das selbe das Import-CSV ergibt.
https://tio.run/##jY/RaoMwFIbv8xQHEYSxOPRqIDJbV8dudtNutyJ61gZiksXYdWif3e ...
Die Import-CSVs sind im Beipiel nur ersetzt durch Demodaten die in den Code integriert wurde, das Ergebnis ist aber das selbe das Import-CSV ergibt.

Rein interessehalber habe ich den Code etwas lesbarer umgeschrieben:
Und mit einem etwas konventionelleren Code verglichen :
Mit Measure-Command ist die 2te Lösung ca 12%-25% schneller.
$csv1 = Import-CSV '.\file1.csv' -Delimiter ";"
$csv2 = Import-CSV '.\file2.csv' -Delimiter ";"
$csv3 = '.\file3.csv'
$csv1 | Select-Object *,@{n='Spalte G';e={$this = $_;
($csv2 | Where-Object{$_.'Spalte A' -eq $this.'Spalte A' -and
$_.'Spalte B' -eq $this.'Spalte B'}).'Spalte G'}
} | Export-Csv $csv3 -Delimiter ";" -NoTypeInformation -Encoding UTF8
Und mit einem etwas konventionelleren Code verglichen :
$csv1 = Import-CSV '.\file1.csv' -Delimiter ";" | Select-Object *,'Spalte G'
$csv2 = Import-CSV '.\file2.csv' -Delimiter ";"
$csv4 = '.\file4.csv'
ForEach($Row in $csv1){
$Row.'Spalte G' = ($Csv2 | Where-Object {
$_.'Spalte A' -eq $Row.'Spalte A' -and
$_.'Spalte B' -eq $Row.'Spalte B'} ).'Spalte G'
}
$csv1 | Export-Csv $csv4 -Delimiter ";" -NoTypeInformation -Encoding UTF8
Mit Measure-Command ist die 2te Lösung ca 12%-25% schneller.