.csv soll via Batch in einer Spalte umgeschrieben werden -> funktioniert nicht

sinkpäd

Lt. Commander
Registriert
Aug. 2009
Beiträge
1.568
Hallo zusammen,

ich habe hier eine .csv Datei, die wie folgt aufgebaut ist:

1;39030;01/16/2024;;29600,00;
1;39030;02/21/2024;03/22/2024;10600,00;
7;39030;02/16/2024;;29600,00;
2424003;39030;01/31/2024;03/01/2024;4050,00;
2424021;39030;02/21/2024;03/22/2024;4050,00;
2424039;39030;03/07/2024;04/06/2024;4050,00;
2424058;39030;04/09/2024;05/09/2024;4050,00;

Man sieht, dass der Aufbau zeilenweise identisch ist, außer dass in Spalte 4 manchmal etwas steht und manchmal nicht (siehe Zeile 1 oder 3)

Ich habe jetzt von ChatGPT eine .bat Datei schreiben lassen, die zeilenweise prüfen soll, ob in Spalte 4 etwas steht und wenn nicht, den Inhalt aus Spalte 3 in Spalte 4 kopiert. Wenn schon ein Wert in Spalte 4 steht, soll nichts geschehen.

So sieht das Skript aktuell aus:

Code:
@echo off
setlocal enabledelayedexpansion

set "inputFile=quelle.csv"
set "outputDir=D:\XXXXX"
set "outputFile=%outputDir%\output.csv"

rem Zielordner erstellen, falls er nicht existiert
if not exist "%outputDir%" (
    mkdir "%outputDir%"
)

rem Zeilenweise durch die Datei iterieren
for /f "tokens=1-5 delims=;" %%a in (%inputFile%) do (
    set "spalte1=%%a"
    set "spalte2=%%b"
    set "spalte3=%%c"
    set "spalte4=%%d"
    set "spalte5=%%e"

    rem Überprüfen, ob Spalte 4 leer ist
    if "!spalte4!"=="" (
        echo Spalte 4 ist leer, kopiere Wert von Spalte 3: !spalte3!
        set "spalte4=!spalte3!"
    ) else (
        echo Spalte 4 hat bereits einen Wert: !spalte4!
    )

    rem Zeile in die Ausgabedatei schreiben
    echo !spalte1!;!spalte2!;!spalte3!;!spalte4!;!spalte5!; >> "%outputFile%"
)

echo Fertig! Die Ausgabe wurde in %outputFile% gespeichert.
endlocal
pause

Das Problem ist nun, dass er bei der Prüfung die leeren Spalte 4 nicht erkennt und stattdessen in Spalte 5 prüft, ob etwas drinsteht und das Skript dann seinen eigentlichen Zweck verfehlt, weil er vermeintlich Inhalte findet.

1732119745024.png


Ich habe weder ChatGPT noch Perplexity dazu bewegen können, dieses Problem zu beheben und würde jetzt gerne wissen, woran das liegen könnte und ob man das mit einer .bat überhaupt lösen kann.

Freue mich über Input.
 
Ich würde es vermutlich mit Powershell machen, da sollte das in 10 Zeilen oder weniger gemacht sein.
Beispiel kann ich evtl. später heute abend liefern.
 
Geht auch mit Regular Expressions in einem Texteditor deiner Wahl und vermutlich auch in wenigen Zeilen als .bat

Screenshot 2024-11-20 at 17.50.09.png
 
Könnte man auch als Einzeiler verpacken, aber so ist's etwas übersichtlicher:
PowerShell:
$csv = Import-Csv -Path C:\temp\test.csv -Header 1,2,3,4,5,6 -Delimiter ";"
$csv | ForEach-Object {
    if ($_.4 -eq '') {$_.4 = $_.3}
}
$csv | Export-Csv -Path C:\temp\new.csv -Delimiter ";" -NoTypeInformation -NoHeader -UseQuotes AsNeeded

Header musste ich definieren, da die Quell-CSV laut obigem Beispiel keinen Header enthält und import-csv ohne die erste Zeile als Header nutzen würde.
NoHeader und UseQuotes werden allerdings erst ab Powershell 7 unterstützt.
 
  • Gefällt mir
Reaktionen: LotusXXL, dms, simpsonsfan und eine weitere Person
Wenn es nicht batch sein muss: Nimm was anderes als batch dafür.

Wenn es Batch sein muss, gibt mehrere Ansätze. Ein relativ einfacher: ändere das Format deiner CSVs, so dass hinter jedem Semikolon ein Leerzeichen steht. Dann sollte das einzelne Leerzeichen als Token 4 erkannt werden.
Oder, da du schreibst, dass die anderen Spalten nie leer sein können, prüfe, on Token 5 einen Wert hat. (Die Variablen, die in deinem Skript spalte# hei8, werden nacheinander gefüllt. Ohne es getestet zu haben, bin ich einigermaßen zuversichtlich, dass dein letztes Token dann leer sein sollte.)
 
Danke für die Ideen. Ich habe es jetzt schlussendlich so gelöst, dass bevor die Prüfung von Spalte 4 auf Inhalt stattfindet, die Zeichenfolge ;; zu ;xx; geändert wird und ihm dann gesagt, dass er xx durch den Wert aus Spalte 3 ersetzen soll. Klappt jetzt, mit Powershell wäre es aber wirklich einfacher gewesen, aber da das nur ein kleiner Auszug aus einer größeren Batch war, war es jetzt so einfacher als alles auf Powershell umzuschreiben.
 
Zurück
Oben