mickey301
Goto Top

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

Content-Key: 464795

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

Printed on: April 25, 2024 at 15:04 o'clock

Member: erikro
Solution erikro Jun 21, 2019 updated at 09:49:56 (UTC)
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
Member: erikro
Solution erikro Jun 21, 2019 at 09:52:49 (UTC)
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  
Member: Mickey301
Mickey301 Jun 21, 2019 at 11:04:03 (UTC)
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
Member: erikro
erikro Jun 21, 2019 at 11:27:13 (UTC)
Goto Top
Gerne. Dir auch ein schönes WE.