我有一个.CSV,我试图从数据中创建另一个文件,但是当我运行它时,它会跳过空白条目。例如,如果是一条线
value,value,value,,,value
而我试图获得第4列,它会吐出第6列。大概是因为它是下一个有效值。我不希望它跳过空白条目,因为它可能弄乱我正在尝试制作的表格。有谁知道如何解决这个问题? (欢迎任何提示,因为我吮吸批处理脚本)
这是我的剧本:
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
答案 0 :(得分:6)
这是FOR / F循环的标准行为,连续delim仅用作一个分隔符 但是你可以使用第二种FOR / 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!
)
)
答案 1 :(得分:1)
正如jeb已经提到his answer,for /F
将连续分隔符视为一个。为了避免这种情况,您可以将每个分隔符,
替换为","
,并将每个完整行括在""
之内,这样每个字段都显示为""
,这很容易最后由~
变量的for /F
修饰符删除;因此,以后不需要再进行字符串操作(如子字符串扩展):
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /F "usebackq delims=" %%# in ("file.csv") do (
set "LINE=%%#"
setlocal EnableDelayedExpansion
for /F "tokens=1-4 delims=," %%A in (^""!LINE:,="^,"!"^") do (
endlocal
echo Field 1: %%~A
echo Field 2: %%~B
echo Field 3: %%~C
echo Field 4: %%~D
setlocal EnableDelayedExpansion
)
endlocal
)
endlocal
如果数据本身包含,
个字符,则这可能无法正常工作(请记住,如果字段被包含在原始CSV文件中的,
内,""
不会被视为分隔符)。
延迟扩展的切换是为了不丢失数据中的任何惊叹号。