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-Key: 61396062189

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

Printed on: April 27, 2024 at 19:04 o'clock

Mitglied: 11078840001
Solution 11078840001 Feb 16, 2024, updated at Feb 17, 2024 at 14:06:53 (UTC)
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 ...
Member: rubberman
rubberman Feb 17, 2024 at 11:56:30 (UTC)
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
Member: freshman2017
freshman2017 Feb 17, 2024 at 13:37:17 (UTC)
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%
    )
)
Member: freshman2017
freshman2017 Feb 17, 2024 at 23:07:34 (UTC)
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
Mitglied: 11078840001
11078840001 Feb 18, 2024 at 07:32:16 (UTC)
Goto Top
Steht bereits oben verlinkt.