gpt4 book ai didi

windows - 使用批处理循环遍历 CSV 文件 - 换行问题

转载 作者:可可西里 更新时间:2023-11-01 11:36:17 29 4
gpt4 key购买 nike

这是对另一个问题的扩展(Loop through CSV file with batch - Space issue)

我有这样的csv文件内容

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

我正在使用此命令循环播放此文件。

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

但由于第二行有换行符,即使文件中有两条记录,我也得到了 3 条记录。

如何解决这个问题?提前致谢。

最佳答案

主要问题似乎是计算一行中的引号。
如果引号的数量是奇数,那么您需要追加下一行并再次计算引号。

如果您不遍历所有字符,那么对字符串中的字符进行计数有点棘手。
我在这里使用了延迟缩减技术,每个报价将被有效地替换为 +1并删除所有其他字符。
要以正确的方式开始和终止该行,总是有一个额外的 +1一开始,这将由 -1 补偿在前面。

主要技巧是用一个 +1 替换从一个引号到下一个引号的完整文本通过用 !!#:#= 替换每个引号.
这用作 !#:#=...<some text>...!将始终扩展为 +1 , 作为变量的内容 #+1所以搜索模式 #找不到。
其他替换只是为了避免文本中的感叹号和插入符号问题。

:::::::::::::::::::::::::::::::::::::::::::
: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
)

以及追加行和插入换行符的逻辑

@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
)

关于windows - 使用批处理循环遍历 CSV 文件 - 换行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714901/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com