/ / Durchlaufen der CSV-Datei mit Batch - Zeilenumbruchproblem - Fenster, Batch-Datei, cmd

Durchlaufen der CSV-Datei mit Batch - Zeilenumbruchproblem - Fenster, Batch-Datei, cmd

Dies ist eine Erweiterung einer anderen Frage (Durchlaufen der CSV-Datei mit Batch-Space-Problem)

Ich habe solche CSV-Dateiinhalte

name,sex,age,description,date
venu,m,16,test mesg,2012-05-01
test,f,22,"He is good guy
and
brilliant",2012-05-01

Ich schleife diese Datei mit diesem Befehl.

For /F "usebackq tokens=1-3 delims=" %%x in (test.csv) Do (

Da es jedoch einen Zeilenumbruch in der zweiten Zeile gibt, erhalte ich 3 Datensätze, obwohl die Datei zwei Datensätze enthält.

Wie kann ich das beheben? Danke im Voraus.

Antworten:

2 für die Antwort № 1

Das Hauptproblem scheint darin zu bestehen, die Anführungszeichen in einer Zeile zu zählen.
Wenn die Anzahl der Anführungszeichen ungerade ist, müssen Sie die nächste Zeile anhängen und die Anführungszeichen erneut zählen.

Das Zählen von Zeichen in einer Zeichenfolge ist etwas schwierig, wenn Sie nicht alle Zeichen durchlaufen.
Ich habe hier die Technik der verzögerten Reduzierung verwendet. Jedes Zitat wird effektiv durch ein ersetzt +1 und alle anderen Zeichen werden entfernt.
Um die Leitung ordnungsgemäß zu beginnen und zu beenden, gibt es immer eine zusätzliche +1 zu Beginn, die durch a kompensiert wird -1 vor.

Der Haupttrick besteht darin, den vollständigen Text von einem Zitat zum nächsten durch genau einen zu ersetzen +1 indem Sie jedes Zitat durch ersetzen !!#:#=.
Dies funktioniert als !#:#=...<some text>...! wird immer erweitert auf +1als Inhalt der Variablen # ist +1 und so das Suchmuster # kann nicht gefunden werden.
Die anderen Ersetzungen sind nur erforderlich, um Probleme mit Ausrufezeichen und Carets im Text zu vermeiden.

:::::::::::::::::::::::::::::::::::::::::::
:CountQuotes <stringVar> <result>
setlocal EnableDelayedExpansion
set "line=!%~1!"
set "#=+1"

rem DelayedExpansion: double all quotes
set "line=!line:"=""!"

rem DelayedExpansion: remove all carets ^
set "line=!line:^=!"

rem PercentExpansion: Remove all !
set "line=%line:!=%"

rem PercentExpansion: Replace double quotes to !!#:#=
set "line=-1^!#:#=%line:""=^!^!#:#=%"

for /F "delims=" %%X in ("!line!") do (
set /a count=%%X!
)

(
endlocal
set %~2=%count%
exit /b
)

Und die Logik zum Anhängen von Zeilen und Einfügen von Zeilenvorschüben

@echo off
setlocal DisableDelayedExpansion
set "lastLine="
set LF=^


rem Two empty lines
for /F "delims=" %%A in (test.csv) do (
set "line=%%A"
setlocal EnableDelayedExpansion
set "line=!line:=x!"
if defined lastLine (
set "line=!lastLine!n!line!"
)

call :CountQuotes line quoteCnt
set /a rest=quoteCnt %% 2
if !rest! == 0 (
for %%L in ("!LF!") DO set "line=!line:n=%%~L!"
set "line=!line:\=!"
echo Complete Row: !Line!
echo(
set "lastLine="
) ELSE (
set "lastLine=!line!"
)

for /F "delims=" %%X in (""!lastLine!"") DO (
endlocal
set "lastLine=%%~X"
)
)
exit /b

:::::::::::::::::::::::::::::::::::::::::::
:CountQuotes <stringVar> <result>
setlocal EnableDelayedExpansion
set "line=!%~1!"
set "#=+1"

rem DelayedExpansion: double all quotes
set "line=!line:"=""!"

rem DelayedExpansion: remove all carets ^
set "line=!line:^=!"

rem PercentExpansion: Remove all !
set "line=%line:!=%"

rem PercentExpansion: Replace double quotes to !!#:#=
set "line=-1^!#:#=%line:""=^!^!#:#=%"

for /F "delims=" %%X in ("!line!") do (
set /a count=%%X!
)

(
endlocal
set %~2=%count%
exit /b
)

1 für die Antwort № 2

Die folgende Batch-Datei macht, was Sie wollen:

@echo Off
setlocal EnableDelayedExpansion

call :processFile < test.csv
goto :EOF


:processFile
set line=
set /P line=
if not defined line exit /b
set "line=!line:,,=,@,!"
for %%a in (name sex age description mydate) do set %%a=
for %%a in (!line!) do (
if not defined name (
set "name=%%a"
) else if not defined sex (
set "sex=%%a"
) else if not defined age (
set "age=%%a"
) else if not defined description (
set "description=%%a"
) else if not defined mydate (
set "mydate=%%a"
)
)
:checkDate
if defined mydate goto show
set /P line=
for /F "tokens=1* delims=," %%a in ("!line!") do (
set "description=!description! %%a"
set "mydate=%%b"
)
goto checkDate
:show
for %%a in (name sex age description mydate) do set /P "=%%a=!%%a!, " < NUL
echo/
goto processFile

Ich habe die Anforderungen hinzugefügt, die Sie in Ihrem angefordert habenVorheriges Thema, dh das Geschlecht ist möglicherweise leer (und wird durch das @ -Zeichen geändert, wie ich in meiner Antwort auf dieses Thema erläutert habe), und der Name kann Kommas enthalten. Ich habe das Programm mit dieser Datendatei getestet:

name,sex,age,description,date
venu,m,16,"test mesg",2012-05-01
test,,22,"He is good guy
and
brilliant",2012-05-01
"venu,gopal",m,16,"Another
multi-line
description",2012-05-02

Und erhalten Sie diese Ergebnisse:

name=name, sex=sex, age=age, description=description, mydate=date,
name=venu, sex=m, age=16, description="test mesg", mydate=2012-05-01,
name=test, sex=@, age=22, description="He is good guy and brilliant", mydate=2012-05-01,
name="venu,gopal", sex=m, age=16, description="Another multi-line description", mydate=2012-05-02,

Beachten Sie, dass jedes Feld Kommas enthält oder Leerzeichen muss in Anführungszeichen gesetzt werden.