For loop delim为';时,批处理脚本跳过.CSV中的空白条目';
我有一个.CSV文件,我正试图通过它来从数据中创建另一个文件,但当我运行它时,它会跳过空白条目。例如,如果一条线是For loop delim为';时,批处理脚本跳过.CSV中的空白条目';,for-loop,batch-file,batch-processing,For Loop,Batch File,Batch Processing,我有一个.CSV文件,我正试图通过它来从数据中创建另一个文件,但当我运行它时,它会跳过空白条目。例如,如果一条线是 value,value,value,,,value 我试着得到第四栏,它会吐出第六栏。大概是因为它是下一个有效值。我不希望它跳过空白条目,因为它会弄乱我要做的表格。有人知道如何解决这个问题吗?(欢迎提供任何提示,因为我不擅长批处理脚本) 这是我的剧本: FOR /F "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14 delims=," %%a in
value,value,value,,,value
我试着得到第四栏,它会吐出第六栏。大概是因为它是下一个有效值。我不希望它跳过空白条目,因为它会弄乱我要做的表格。有人知道如何解决这个问题吗?(欢迎提供任何提示,因为我不擅长批处理脚本)
这是我的剧本:
FOR /F "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14 delims=," %%a in (file.csv) DO (
echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n
)
pause
这是FOR/F循环的标准行为,连续的delims仅用作一个分隔符。
但您可以使用一种解决方案,其中第二个用于/F.
在每一列前面加上另一个字符,在delim处拆分行并删除前缀
setlocal EnableDelayedExpansion
FOR /F "delims=" %%L in (test.bat) DO (
set "line=%%L,,,,,,,,"
set "line=#!line:,=,#!"
FOR /F "tokens=1,2,3,4 delims=," %%a in ("!line!") DO (
set "param1=%%a"
set "param2=%%b"
set "param3=%%c"
set "param4=%%d"
set "param1=!param1:~1!"
set "param2=!param2:~1!"
set "param3=!param3:~1!"
set "param4=!param4:~1!"
echo !param1! !param2! !param3! !param4!
)
)
如中所述,for/F
将连续分隔符视为一个分隔符。为了避免这种情况,您可以将每个分隔符,
替换为,“
,并用”
括起每一行,这样每个字段都显示为被“
括起,最后可以通过for/F
变量的~
修饰符轻松删除;因此,以后无需再进行任何字符串操作(如子字符串扩展):
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
对于/F“usebackq delims=“%%#in”(“file.csv”)do(
设置“行=%%#”
setlocal EnableDelayedExpansion
对于/F“tokens=1-4 delims=,”%%A in(^“”!LINE:,=“^,”!“^”)do(
端部
回显字段1:%%~A
回波字段2:%%~B
回波字段3:%%~C
回波字段4:%%~D
setlocal EnableDelayedExpansion
)
端部
)
端部
如果数据本身包含,
字符,这可能无法正常工作(请记住,如果原始CSV文件中的,
字段包含在“
中,则不会将其视为分隔符)
延迟扩展的切换是为了不丢失数据中的任何感叹号