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
Vielen Dank!
Euer Mickey
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 464795
Url: https://administrator.de/contentid/464795
Printed on: April 25, 2024 at 15:04 o'clock
4 Comments
Latest comment
Moin,
neeeeee, viel zu kompliziert. Ich würde das als Ansatz so lösen:
1. Aus der Ersetzungstabelle ein Objekt machen:
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:
BTW: Nimm in Skripten nicht die Pipe auf foreach-object, sondern die Schleife foreach. Letzteres ist deutlich schneller.
hth
Erik
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
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