zahnfee
Goto Top

Mit PowerShell eine Spalte einer CSV Datei bearbeiten. Wert lesen-ersetzen und Datei neu schreiben

Hallo zusammen,

ich versuche verzweifelt mit PowerShell eine CSV Datei zu bearbeiten, bekomme es aber irgendwie nicht hin - vielleicht kann mir hier jemand bei meinem Problem helfen.

Ich habe eine CSV-Datei mit z.B. folgendem Aufbau:

Spalte1;Spalte2;Spalte3;Spalte4;Spalte5;Spalte6;Spalte7;Spalte8
252;Teile 252;1;2,47;5,49;J;18.06.2023;44442522
254;Teile 254;1;3,86;8,49;N;18.06.2023;44042548
432;Teile 432;1;6,60;14,29;J;18.06.2023;44044320
449;Teile 449;1;7,62;19,29;B;18.06.2023;44044498

Nun möchte ich die Datei lesen und die Spalte 6 ändern, so dass das Ergebnis danach wie folgt ausschaut. Also die Buchstaben N & B durch 0 ersetzten, sowie N durch 2 ersetzten.

Spalte1;Spalte2;Spalte3;Spalte4;Spalte5;Spalte6;Spalte7;Spalte8
252;Teile 252;1;2,47;5,49;2;18.06.2023;44442522
254;Teile 254;1;3,86;8,49;0;18.06.2023;44042548
432;Teile 432;1;6,60;14,29;2;18.06.2023;44044320
449;Teile 449;1;7,62;19,29;0;18.06.2023;44044498

Ich bin soweit, dass mir eine neue Datei erstellt wird, aber außer das sie größer ist als die Ausgangsdatei, hat sich nichts geändert. Hier mein Script:

# Pfade zu deiner Eingabe- und Ausgabedatei
$eingabeDatei = "C:\Daten\Eingabedatei.csv"  
$ausgabeDatei = "C:\Daten\Augabedatei.csv"  

# Importiere die CSV-Datei
$daten = Import-Csv -Path $eingabeDatei -Delimiter ";"  

# Durchlaufe die Daten und ersetze den Wert in Spalte 6 entsprechend
foreach ($eintrag in $daten) {
    if ($eintrag.line6 -eq "J") {  
        $eintrag.line6 = 2
    } elseif ($eintrag.line6 -eq "N") {  
        $eintrag.line6 = 0
    } elseif ($eintrag.line6 -eq "B") {  
        $eintrag.line6 = 0
    }
}

# Exportiere die modifizierten Daten in eine neue CSV-Datei
$daten | Export-Csv -Path $ausgabeDatei -Delimiter ";" -NoTypeInformation  


Jetzt komme ich nicht mehr weiter und wäre sehr dankbar für Tipps oder eine Lösung.

Content-ID: 7581573880

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

Ausgedruckt am: 24.11.2024 um 11:11 Uhr

Kraemer
Kraemer 19.06.2023 um 13:41:22 Uhr
Goto Top
Moin,

heißt die Spalte nun Spalte6 oder line6?

Gruß
kreuzberger
kreuzberger 19.06.2023 um 13:43:47 Uhr
Goto Top
Mahlzeit, aber nach mal, wenn die Buchstaben N und B nicht an anderer Stelle vorkommen brauchst du doch gar nicht Spalten etc zu berücksichtigen, sondern machst ein suchen-ersetzen in der gesamten Datei, und gut is.

Kreuzberger
rrobbyy
rrobbyy 19.06.2023 um 13:59:50 Uhr
Goto Top
stumpfes ersetzen bringt sicher nix, weil evtl. spalte 2 irgendwelche daten haben könnte....

probiere es mal damit
# Pfad zur CSV-Datei
 $csvPath = "C:\Temp\test.csv"  

 # Zeile für Zeile die CSV-Datei einlesen und bearbeiten
 $csvContent = Get-Content -Path $csvPath
 $newCsvContent = foreach ($line in $csvContent) {
     # Spaltenwerte aufteilen
     $columns = $line -split ";"  

     # Überprüfen, ob die Spalte, die du bearbeiten möchtest, den Wert enthält
     if ($columns[5] -eq "J") {  
         # Wert in der Spalte ersetzen
         $columns[5] = "2"  
     }

     # Zeile mit den aktualisierten Werte zusammenfügen
     $newLine = $columns -join ";"  
     $newLine
 }

 # korrigierter Inhhalt in die CSV-Datei schreiben
 $newCsvContent | Out-File -FilePath $csvPath -Encoding UTF8
erikro
erikro 19.06.2023 um 14:21:45 Uhr
Goto Top
Moin,

# Pfade zu deiner Eingabe- und Ausgabedatei
$eingabeDatei = "C:\Daten\Eingabedatei.csv"  
$ausgabeDatei = "C:\Daten\Augabedatei.csv"  

# Importiere die CSV-Datei
$daten = Import-Csv -Path $eingabeDatei -Delimiter ";"  

# Durchlaufe die Daten und ersetze den Wert in Spalte 6 entsprechend
foreach ($eintrag in $daten) {
    if ($eintrag.line6 -eq "J") {  
        $eintrag.line6 = 2
    } elseif ($eintrag.line6 -eq "N") {  
        $eintrag.line6 = 0
    } elseif ($eintrag.line6 -eq "B") {  
        $eintrag.line6 = 0
    }


# Exportiere die modifizierten Daten in eine neue CSV-Datei
$eintrag | Export-Csv -Path $ausgabeDatei -Delimiter ";" -NoTypeInformation -append  
}

hth

Erik
7426148943
Lösung 7426148943 19.06.2023 aktualisiert um 14:40:14 Uhr
Goto Top
Man sollte die Spaltenbezeichner schon richtig schreiben ...
# Pfade zu deiner Eingabe- und Ausgabedatei
$eingabeDatei = "C:\Daten\Eingabedatei.csv"  
$ausgabeDatei = "C:\Daten\Augabedatei.csv"  

# Importiere die CSV-Datei
$daten = Import-Csv -Path $eingabeDatei -Delimiter ";"  

# Durchlaufe die Daten und ersetze den Wert in Spalte 6 entsprechend
foreach ($eintrag in $daten) {
    switch($eintrag.Spalte6){
       {$_ -in 'N','B'} {$eintrag.Spalte6 = 0}  
       'J' {$eintrag.Spalte6 = 2}  
    }
}
# Exportiere die modifizierten Daten in eine neue CSV-Datei
$daten | Export-Csv -Path $ausgabeDatei -Delimiter ";" -NoTypeInformation -Encoding UTF8  

Online-Demo
Zahnfee
Zahnfee 19.06.2023 um 15:43:46 Uhr
Goto Top
Der Knackpunkt lag am Spaltenbezeichner, kaum schreibt man den richtig, funktioniert das ganze auch...
Manchmal sieht man den Wald vor lauter Bäumen nicht.

Vielen Dank für die Hilfe
Kraemer
Kraemer 19.06.2023 um 16:11:53 Uhr
Goto Top
Zitat von @Zahnfee:

Manchmal sieht man den Wald vor lauter Bäumen nicht.

dafür gibt es Fehlermeldungen...
7426148943
7426148943 19.06.2023 aktualisiert um 16:23:21 Uhr
Goto Top
Zitat von @Kraemer:
dafür gibt es Fehlermeldungen...
Nur das es in dem Fall keine gab weil die IF-Anweisung die falsche Spaltenangabe nicht anmeckert und so die Bedingungen silent ignoriert werden weil der leere Wert mit keiner übereinstimmt face-smile. Aber er hätte ja zumindest einmal den Debugger bemühen können um zu sehen was in $eintrag.line6 tatsächlich steht.
Kraemer
Kraemer 19.06.2023 um 16:30:42 Uhr
Goto Top
Zitat von @7426148943:

Zitat von @Kraemer:
dafür gibt es Fehlermeldungen...
Nur das es in dem Fall keine gab weil die IF-Anweisung die falsche Spaltenangabe nicht anmeckert und so die Bedingungen silent ignoriert werden weil der leere Wert mit keiner übereinstimmt face-smile. Aber er hätte ja zumindest einmal den Debugger bemühen können um zu sehen was in $eintrag.line6 tatsächlich steht.

stimmt, hast Recht.