thedummy
Goto Top

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.

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

138810
138810 13.03.2019 aktualisiert um 10:47:11 Uhr
Goto Top
Klar, und wieder mal Suchfunktion face-sad...
Per Batch eine Spalte in eine CSV Datei einfügen
thedummy
thedummy 13.03.2019 um 11:03:10 Uhr
Goto Top
allerdings wird dort nur beschrieben, wie eine weitere Spalte hinzugefügt wird. Ich möchte die Spalte aus einer anderen CSV Datei kopieren.
138810
138810 13.03.2019 aktualisiert um 11:07:54 Uhr
Goto Top
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...
thedummy
thedummy 13.03.2019 um 11:05:33 Uhr
Goto Top
grundsätzlich gebe ich Dir recht. Keine Frage. Ich habe halt nicht wirklich einen Plan von PowerShell Kommandos.
138810
138810 13.03.2019 um 11:06:19 Uhr
Goto Top
S. Erg.
thedummy
thedummy 13.03.2019 um 11:08:06 Uhr
Goto Top
ich will eigentlich nur stumpf eine bestimmte Spalte aus der zweiten CSV in die erste CSV kopieren. Die ersten zwei Spalten der CSV Dateien sind gleich.
138810
138810 13.03.2019, aktualisiert am 14.03.2019 um 11:15:02 Uhr
Goto Top
$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  
Spaltennamen und Dateipfade anpassen.

Tschö ...
thedummy
thedummy 13.03.2019 um 12:32:38 Uhr
Goto Top
Zunächst einmal Danke.

Ich habe das wie folgt modifiziert und erhalte eine Fehlermeldung.

$csv1 | Import-CSV 'y:\test\csv01.csv' -delimiter ";"  
$csv2 | Import-CSV 'y:\test\csv99.csv' -delimiter ";"  
$csv1 | select *,@{n='global_rad:W';e={$this = $_; $csv2 | ?{$_.'station_id' -eq $this.'station_id' and $_.'validdate' -eq $this.'validdate'} | select -Expand 'global_rad:W'}} | export-csv .\januar01.csv -delimiter ";" -NoTypeInformation -Encoding UTF8  

Fehlermeldung:
Der Befehl "$csv1" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
138810
138810 13.03.2019 um 12:39:43 Uhr
Goto Top
Tippfehler.
thedummy
thedummy 13.03.2019 um 12:55:54 Uhr
Goto Top
face-smile ja, habe den Tippfehler gefunden:

$csv1 = Import-CSV 'y:\test\csv01.csv' -delimiter ";"  
$csv2 = Import-CSV 'y:\test\csv99.csv' -delimiter ";"  
$csv1 | select *,@{n='global_rad:W';e={$this = $_; $csv2 | ?{$_.'station_id' -eq $this.'station_id' and $_.'validdate' -eq $this.'validdate'} | select -Expand 'global_rad:W'}} | export-csv .\januar01.csv -delimiter ";" -NoTypeInformation -Encoding UTF8  

Erhalte die selbe Fehlermeldung, allerdings mit dem Hinweis auf die letzte Zeile: $csv1 | select...
138810
138810 13.03.2019 aktualisiert um 13:10:35 Uhr
Goto Top
Nöp hier getestet ...geht einwandfrei.

Viel Spaß noch beim Powershell lernen, ich bin jetzt raus.
Kraemer
Kraemer 13.03.2019 um 18:22:21 Uhr
Goto Top
Zitat von @138810:
> $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  
> 
Interessantes Konstrukt. Muss ich mir in einer ruhigen Minute mal reinziehen. Danke dafür.
Kraemer
Kraemer 13.03.2019 um 18:23:39 Uhr
Goto Top
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...
138810
138810 13.03.2019 aktualisiert um 20:34:09 Uhr
Goto Top
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.
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.
thedummy
thedummy 14.03.2019 um 11:08:23 Uhr
Goto Top
ich finde den fehler nicht face-sad

erhalte für jede zeile die meldung, dass der befehl entweder falsch ist oder nicht gefunden werden konnte.

hilfee

$csv1 = Import-CSV 'y:\test\csv01.csv' -delimiter ";"  
$csv2 = Import-CSV 'y:\test\csv99.csv' -delimiter ";"  
$csv1 | select *,@{n='global_rad:W';e={$this = $_; $csv2 | ?{$_.'station_id' -eq $this.'station_id' and $_.'validdate' -eq $this.'validdate'} | select -Expand 'global_rad:W'}} | export-csv 'y:\test\januar01.csv' -delimiter ";" -NoTypeInformation -Encoding UTF8  
138810
138810 14.03.2019 aktualisiert um 11:16:03 Uhr
Goto Top
ich finde den fehler nicht
Da fehlt bei dir ein Bindestrich vor dem "and".
thedummy
thedummy 14.03.2019 um 11:22:19 Uhr
Goto Top
$csv1 = Import-CSV 'y:\test\csv01.csv' -delimiter ";"  
$csv2 = Import-CSV 'y:\test\csv99.csv' -delimiter ";"  
$csv1 | select *,@{n='global_rad:W';e={$this = $_; $csv2 | ?{$_.'station_id' -eq $this.'station_id' -and $_.'validdate' -eq $this.'validdate'} | select -Expand 'global_rad:W'}} | export-csv 'y:\test\januar01.csv' -delimiter ";" -NoTypeInformation -Encoding UTF8  

leider hat das nicht geholfen. selbe fehlermeldung
Kraemer
Kraemer 14.03.2019 um 11:26:01 Uhr
Goto Top
Zitat von @138810:
Da kann ich dir schon mal auf die Sprünge helfen.
ich danke dir! Hat mich erheblich weiter gebracht
138810
138810 14.03.2019 aktualisiert um 11:30:59 Uhr
Goto Top
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.
138810
138810 14.03.2019 aktualisiert um 15:49:50 Uhr
Goto Top
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.
77559
77559 14.03.2019 um 22:01:16 Uhr
Goto Top
Rein interessehalber habe ich den Code etwas lesbarer umgeschrieben:

$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.