Wie füge ich in einer CSV Datei Spalten mit PowerShell hinzufügen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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