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:
Jetzt komme ich nicht mehr weiter und wäre sehr dankbar für Tipps oder eine Lösung.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7581573880
Url: https://administrator.de/contentid/7581573880
Ausgedruckt am: 24.11.2024 um 11:11 Uhr
9 Kommentare
Neuester Kommentar
stumpfes ersetzen bringt sicher nix, weil evtl. spalte 2 irgendwelche daten haben könnte....
probiere es mal damit
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
Moin,
hth
Erik
# 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
Man sollte die Spaltenbezeichner schon richtig schreiben ...
Online-Demo
# 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
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 . Aber er hätte ja zumindest einmal den Debugger bemühen können um zu sehen was in $eintrag.line6 tatsächlich steht.
Zitat von @7426148943:
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 . Aber er hätte ja zumindest einmal den Debugger bemühen können um zu sehen was in $eintrag.line6 tatsächlich steht.
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 . 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.