Wie füge ich in einer CSV Datei Spalten mit PowerShell hinzufügen?
Hi, habe jetzt schon sehr viele Skripts usw. probiert, aber funktioniert einfach nicht so wie ich es haben will. Entweder es werden die benötigten Wörter alle zusammen in eine Spalte geworfen, oder das Dokument ist einfach leer etc.
Ich sitze schon seit über einer Woche an diesem Problem und komme einfach nicht weiter, habt ihr vielleicht Tipps für mich, wie ich das Problem lösen kann?
1 Antwort
Im einfachste Fall ist die Sache ganz simple Stringakrobatik. CSV ist einfach eine Datei mit Stringzeilen und Strings kann man etwas hinzufügen:
Demo0.ps1
$String1='"Name","Vorname","Ort"'
$String2='"Geschlecht","Erben"'
$String1+','+$String2 #das ist sehr unordentlich...
#besser mit -format String
'{0},{1}' -f $String1 , $String2
Ich habe zwei CSVdateien welche ich Zeilenweise zusammenführen möchte:
test1.csv
"Name","Vorname","Ort"
"Meier","Franz","Kleckersdorf"
"Huber ","Xaver","Bergstadt"
"Paschuke","Erna","Keksfeld"
"Zechpreller","Max","Schnorringen"
test2.csv
"Geschlecht","Erben"
"m","6"
"d","0"
"w","22"
Am einfachsten ist die "Holzhammermethode" einfach die Zeilen beider Dateien als Strings einlesen und wie in Demo0 zusammenkleistern.
nicht schön aber Effizient:
demo1.ps1
$CsvLines1=@(Get-Content 'test1.csv')
'Daten in CSV1:'
$CsvLines1
$CsvLines2=@(Get-Content 'test2.csv')
'Daten in CSV2'
$CsvLines2
#vereinigen mit ganz banaler Stringakrobatik
$NewLines=$CsvLines1|%{$index=0}{
if ($CsvLines2[$index]){
'{0},{1}' -f $_,$CsvLines2[$index]
}
else {
#wenn die Zeilen in der 2.Datei nicht ausreichen...
'{0},{1}' -f $_,'"Keine Daten","Keine Daten"'
}
$index++
}
'Daten Vereinigt:'
$NewLines
#Den ganzen "sch..." wieder Speichern...
$NewLines|Set-Content 'new.csv'
pause
...das war einfach brutal...
Normalerweise arbeitet man mit Objekten... ich verzichte mal auf die automatische Erkennung von Properties und deren zusammenfügen, sonst würde es richtig derb.
...also erstellen eines von Hand definierten Objekts und zuweisen der Objektpropeties anhand deren Reihung (index)
demo2.ps1
$ObjectArray1=Import-Csv 'test1.csv'
$ObjectArray2=Import-Csv 'test2.csv'
#mal anzeigen
$ObjectArray1|ft
$ObjectArray2|ft
#definiere neues PSCustomObject mit den Daten aus beiden csv
$MergedObjects=$ObjectArray1|%{$index=0}{
if ($ObjectArray2[$index]){
[PSCustomObject]@{
Name = $_.Name
Vorname = $_.Vorname
Ort = $_.Ort
Geschlecht= $ObjectArray2[$index].Geschlecht
Erben = $ObjectArray2[$index].Erben
}
}
else {
[PSCustomObject]@{
Name = $_.Name
Vorname = $_.Vorname
Ort = $_.Ort
Geschlecht= 'unknown'
Erben = 'unknown'
}
}
$index++
}
#mal anzeigen
$MergedObjects|ft * -auto
# als Neues CSV Exportieren
$MergedObjects|Export-Csv -Path 'Neu.csv' -NoTypeInformation
pause
Da Du nicht Angegeben hast woher du die Daten für die Neu hinzuzufügenden Propeties hebekommst wäre auch Input von Hand eine Option:
Demo3.ps1
$ObjectArray1=Import-Csv 'test1.csv'
#mal anzeigen
$ObjectArray1|ft
#definiere neues PSCustomObject mit den Daten aus beiden csv
$MergedObjects=$ObjectArray1|%{
Write-Host 'Bisherige Daten:' -fo green
Write-Host (
'Name: {0}
Vorname: {1}
Ort: {2}' -f $_.Name,$_.Vorname,$_.Ort) -fo yellow
$newObject=[PSCustomObject]@{
Name = $_.Name
Vorname = $_.Vorname
Ort = $_.Ort
Geschlecht= 'unbekannt'
Erben = 'unbekannt'
}
$Gender = Read-Host 'welches Geschlecht soll ich eintragen? (m,w,d oder Enter)'
$Heirs = Read-Host 'wwie viele Erben gibt es? (Anzahl oder Enter)'
if ($Genter){$newObject.Geschlecht = $Gender} #wenn etwas eingegeben wurde dies im Objekt änden
if ($Heirs) {$newObject.Erben = $Heirs} #dito
$newObject #fertiges Object in die Pipe schreiben
}
#mal anzeigen
$MergedObjects|ft * -auto
# als Neues CSV Exportieren
$MergedObjects|Export-Csv -Path 'Neu.csv' -NoTypeInformation
pause
..ist doch garnicht schwer...