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-Key: 427769

Url: https://administrator.de/contentid/427769

Printed on: April 23, 2024 at 20:04 o'clock

Mitglied: 138810
138810 Mar 13, 2019 updated at 09:47:11 (UTC)
Goto Top
Klar, und wieder mal Suchfunktion face-sad...
Per Batch eine Spalte in eine CSV Datei einfügen
Member: thedummy
thedummy Mar 13, 2019 at 10:03:10 (UTC)
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.
Mitglied: 138810
138810 Mar 13, 2019 updated at 10:07:54 (UTC)
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...
Member: thedummy
thedummy Mar 13, 2019 at 10:05:33 (UTC)
Goto Top
grundsätzlich gebe ich Dir recht. Keine Frage. Ich habe halt nicht wirklich einen Plan von PowerShell Kommandos.
Mitglied: 138810
138810 Mar 13, 2019 at 10:06:19 (UTC)
Goto Top
S. Erg.
Member: thedummy
thedummy Mar 13, 2019 at 10:08:06 (UTC)
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.
Mitglied: 138810
138810 Mar 13, 2019, updated at Mar 14, 2019 at 10:15:02 (UTC)
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ö ...
Member: thedummy
thedummy Mar 13, 2019 at 11:32:38 (UTC)
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.
Mitglied: 138810
138810 Mar 13, 2019 at 11:39:43 (UTC)
Goto Top
Tippfehler.
Member: thedummy
thedummy Mar 13, 2019 at 11:55:54 (UTC)
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...
Mitglied: 138810
138810 Mar 13, 2019 updated at 12:10:35 (UTC)
Goto Top
Nöp hier getestet ...geht einwandfrei.

Viel Spaß noch beim Powershell lernen, ich bin jetzt raus.
Member: Kraemer
Kraemer Mar 13, 2019 at 17:22:21 (UTC)
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.
Member: Kraemer
Kraemer Mar 13, 2019 at 17:23:39 (UTC)
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...
Mitglied: 138810
138810 Mar 13, 2019 updated at 19:34:09 (UTC)
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.
Member: thedummy
thedummy Mar 14, 2019 at 10:08:23 (UTC)
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  
Mitglied: 138810
138810 Mar 14, 2019 updated at 10:16:03 (UTC)
Goto Top
ich finde den fehler nicht
Da fehlt bei dir ein Bindestrich vor dem "and".
Member: thedummy
thedummy Mar 14, 2019 at 10:22:19 (UTC)
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
Member: Kraemer
Kraemer Mar 14, 2019 at 10:26:01 (UTC)
Goto Top
Zitat von @138810:
Da kann ich dir schon mal auf die Sprünge helfen.
ich danke dir! Hat mich erheblich weiter gebracht
Mitglied: 138810
138810 Mar 14, 2019 updated at 10:30:59 (UTC)
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.
Mitglied: 138810
138810 Mar 14, 2019 updated at 14:49:50 (UTC)
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.
Mitglied: 77559
77559 Mar 14, 2019 at 21:01:16 (UTC)
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.