freshman2017
Goto Top

Batch: CSV Werte Spalte aufteilen

Hallo liebe Gemeinde,

kann ich mit einer Batch erwirken, dass wenn in einer CSV-Spalte, hier Spalte 2, mehrere Kommagetrennte Werte stehen, dass diese in eine neue Zeile geschrieben werden?

Input:

Spalte1;Wert1;Spalte2;Spalte3;Spalte4;
Spalte1;Wert1,Wert2,Wert3;Spalte2;Spalte3;Spalte4;
Spalte1;Wert1;Spalte2;Spalte3;Spalte4;

Output:

Spalte1;Wert1;Spalte2;Spalte3;Spalte4;
Spalte1;Wert1;Spalte2;Spalte3;Spalte4;
Spalte1;Wert2;Spalte2;Spalte3;Spalte4;
Spalte1;Wert3;Spalte2;Spalte3;Spalte4;
Spalte1;Wert1;Spalte2;Spalte3;Spalte4;

VG!

Content-ID: 61396062189

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

Ausgedruckt am: 21.11.2024 um 16:11 Uhr

11078840001
Lösung 11078840001 16.02.2024, aktualisiert am 17.02.2024 um 15:06:53 Uhr
Goto Top
@echo off &setlocal enabledelayedexpansion
>"datei-neu.csv" (for /f "usebackq tokens=1-5vdelims=;" %%a in ("d:\datei.csv") do (  
    set "parts=%%b"  
    for %%f in (!parts:,= !) do echo.%%a;%%f;%%c;%%d,%%e
))
Aber besser gleich PowerShell wegen diverser Batch Unzulänglichkeiten die bei CSV Dateien auftreten können...
https://tio.run/##jVDBTsMwDL3nK6yqUlppqdQNuFRIk4oEXLgMwbnrPBbIkigxqya2by ...
rubberman
rubberman 17.02.2024 um 12:56:30 Uhr
Goto Top
Hallo.

Warnung: Es gibt keine Möglichkeit CSV Daten in Batch sicher zu verarbeiten.
Die offensichtlich einfachste Möglichkeit einer Tokenisierung mit FOR /F schlägt schon bei Kleinigkeiten fehl, wie bei Feldern ohne Daten
123;;456
oder bei Textfeldern mit Datentrennzeichen
123;"a;b";456

Steffen
freshman2017
freshman2017 17.02.2024 um 14:37:17 Uhr
Goto Top
Ich hatte folgende Idee

@echo off
setlocal enabledelayedexpansion

set input_file=input.csv
set output_file=output.csv

del %output_file%

for /f "tokens=1-5 delims=;" %%a in (%input_file%) do (  
    for %%w in (%%b) do (
        echo %%a;%%w;%%c;%%d;%%e; >> %output_file%
    )
)
freshman2017
freshman2017 18.02.2024 um 00:07:34 Uhr
Goto Top
Wie kann ich den

$inputFilePath = "input.csv"  

$csvData = Import-Csv $inputFilePath -Delimiter ";" -Header Spalte1, Wert1, Spalte2, Spalte3, Spalte4  

$ergebnis = @()

foreach ($row in $csvData) {
    if ($row.Wert1 -like "*,*") {  
        $values = $row.Wert1.Split(",")  
        foreach ($value in $values) {
            $newRow = $row.Clone()
            $newRow.Wert1 = $value
            $ergebnis += $newRow
        }
    } else {
        $ergebnis += $row
    }
}

$ergebnis | Export-Csv -Path "output.csv" -Delimiter ";" -NoTypeInformation  
(Get-Content "output.csv") | ForEach-Object { $_ -replace '\r$', ';' } | Set-Content "output.csv"  

Write-Host "Die CSV-Datei wurde erfolgreich bearbeitet und gespeichert unter: output.csv"  

Mit tio.run testen
11078840001
11078840001 18.02.2024 um 08:32:16 Uhr
Goto Top
Steht bereits oben verlinkt.