mickey301

PowerShell - div. Begriffe in einer CSV ersetzen

Hallo zusammen,

ich sitze gerade an einer Aufgabe und hoffe, dass ihr mir helfen könnt.
Ich möchte eine CSV durchsuchen und dort Begriffe durch IDs ersetzen (für einen Import in ein anderes System).
Einige Begriffe haben die selben IDs. Das Subsystem unterscheidet z.B. nicht nach Hard- & Software.

Folgenden Ansatz habe ich, dieser funktioniert auch soweit, allerdings habe ich im Orginal nicht nur 4 sondern 40 Begriffe, die ich ersetzen muss.
Und sobald ich eine Änderung habe, muss ich die Variablen und die if/else-Schleife anpassen. Das geht doch bestimmt besser/einfacher?

Kann ich vielleicht auch mit einer "Übersetzungtabelle" arbeiten?
Software Info = 10
Hardware Info = 10
Software Fehler = 50
Hardware Fehler = 50

$InputFile =  "C:\Test\input.csv"  
$OutputFile = "C:\Test\output.csv"  
$Header =  "Datum","Zeit","ID"  

$Replace1 = "Software Info"  
$Replace2 = "Hardware Info"  
$Replace3 = "Software Fehler"  
$Replace4 = "Hardware Fehler"  

Import-Csv $InputFile -Delimiter ";" -header $Header | foreach {   
   
    if ($_.ID -eq $Replace1)
       { $IDnew = "10"  
       $_.Datum,$_.Zeit,$IDnew -join ';' | out-file $OutputFile -append }  

    elseif ($_.ID -eq $Replace2)
       { $IDnew = "10"  
       $_.Datum,$_.Zeit,$IDnew -join ';' | out-file $OutputFile -append }  

    elseif ($_.ID -eq $Replace3)
       { $IDnew = "50"  
       $_.Datum,$_.Zeit,$IDnew -join ';' | out-file $OutputFile -append }  

    elseif ($_.ID -eq $Replace4)
       { $IDnew = "50"  
       $_.Datum,$_.Zeit,$IDnew -join ';' | out-file $OutputFile -append }  
}


Vielen Dank!
Euer Mickey
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 464795

Url: https://administrator.de/forum/powershell-div-begriffe-in-einer-csv-ersetzen-464795.html

Ausgedruckt am: 13.06.2025 um 02:06 Uhr

erikro
Lösung erikro 21.06.2019 aktualisiert um 11:49:56 Uhr
Goto Top
Moin,

neeeeee, viel zu kompliziert. Ich würde das als Ansatz so lösen:

1. Aus der Ersetzungstabelle ein Objekt machen:

$replace = new-object PSObject
$replace | add-member -NotePropertyName "Software Info" -NotePropertyValue 10  
$replace | add-member -NotePropertyName "Hardware Info" -NotePropertyValue 10  
$replace | add-member -NotePropertyName "Software Fehler" -NotePropertyValue 50  
...

Das kann man sicherlich auch eleganter mit z. B. einer einzulesenden Textdatei und einer Schleife erledigen, so dass man die Einträge leichter pflegen kann.

Mit dem Objekt kannst Du nun die Ersetzungen in einem Schritt vornehmen:

$data = Import-Csv $InputFile -Delimiter ";" -header $Header  

foreach($dataset in $data) {
   $dataset.id = $replace.($dataset.id) #ob das so geht, musst Du ausprobieren. Evtl. muss $data.id vorher noch in eine Variable geschrieben werden.
}

BTW: Nimm in Skripten nicht die Pipe auf foreach-object, sondern die Schleife foreach. Letzteres ist deutlich schneller.

hth

Erik
erikro
Lösung erikro 21.06.2019 um 11:52:49 Uhr
Goto Top
Nochmal komplett und getestet:

$replace = new-object PSObject
$replace | add-member -NotePropertyName "Software Info" -NotePropertyValue 10  
$replace | add-member -NotePropertyName "Hardware Info" -NotePropertyValue 10  
$replace | add-member -NotePropertyName "Software Fehler" -NotePropertyValue 50  
$replace | add-member -NotePropertyName "Hardware Fehler" -NotePropertyValue 50  
$data = Import-Csv $input -Delimiter ";"  

foreach($dataset in $data) {
   $dataset.id = $replace.($dataset.id) #funktioniert!
}

$data | Export-Csv $output -delimiter ";" -NoTypeInformation  
Mickey301
Mickey301 21.06.2019 um 13:04:03 Uhr
Goto Top
Hey Erik,

super, vielen Dank für deine Mühe und deine Antworten!
Das macht das Skript deutlich einfacher zu handeln.

Danke auch für den foreach Tip.

Ich wünsche Dir ein wunderbares Wochenende.

Beste Grüße
Mickey
erikro
erikro 21.06.2019 um 13:27:13 Uhr
Goto Top
Gerne. Dir auch ein schönes WE.