Batch file 循环浏览带有批处理空间问题的CSV文件
我有一个像这样的csv文件Batch file 循环浏览带有批处理空间问题的CSV文件,batch-file,cmd,Batch File,Cmd,我有一个像这样的csv文件 name,sex,age venu,m,16 test,,22 @Echo Off For /F "usebackq tokens=1-3 delims=," %%a in (test.csv) Do ( echo %%a, %%b, %%c >> test-new.csv ) [编辑] 名称也可以有逗号 "venu,gopal",m,16 我想处理,如果性是什么,并保存到另一个文件 我有一个这样的剧本 name,sex,age venu,m
name,sex,age
venu,m,16
test,,22
@Echo Off
For /F "usebackq tokens=1-3 delims=," %%a in (test.csv) Do (
echo %%a, %%b, %%c >> test-new.csv
)
[编辑]名称也可以有逗号
"venu,gopal",m,16
我想处理,如果性是什么,并保存到另一个文件
我有一个这样的剧本
name,sex,age
venu,m,16
test,,22
@Echo Off
For /F "usebackq tokens=1-3 delims=," %%a in (test.csv) Do (
echo %%a, %%b, %%c >> test-new.csv
)
但是对于第三条记录,我得到的%%b为22,应该是空格。如何解决这个问题
[EDIT2]
我已经尝试按照该链接。我不确定我做错了什么。我也有同样的问题。请检查一下
@echo off
setlocal DisableDelayedExpansion
For /F "usebackq tokens=1-3 delims=" %%x in (C:\somefile.csv) Do (
setlocal EnableDelayedExpansion
set "var=%%x"
set "var=!var:"=""!"
set "var=!var:^=^^!"
set "var=!var:&=^&!"
set "var=!var:|=^|!"
set "var=!var:<=^<!"
set "var=!var:>=^>!"
set "var=!var:,=^,^,!"
set var=!var:""="!
set "var=!var:"=""Q!"
set "var=!var:,,="S"S!"
set "var=!var:^,^,=,!"
set "var=!var:""="!"
set "var=!var:"Q=!"
For /F "tokens=1-3 delims=," %%a in ("!var:"S"S=","!") Do (
endlocal
echo %%~a, %%~b, %%~c
setlocal EnableDelayedExpansion
pause
)
endlocal
)
@echo关闭
setlocal DisableDelayedExpansion
对于/F“usebackq tokens=1-3 delims=“%%x in(C:\somefile.csv)Do(
setlocal EnableDelayedExpansion
设置“var=%%x”
设置“var=!var:=”!“
设置“var=!var:^=^^!”
设置“var=!var:&=^&!”
设置“变量=!变量:|=^ |!”
设置“var=!var:!”
设置“var=!var:,=^,^,!”
设置变量=!变量:“”!
设置“var=!var:=”“Q!”
设置“var=!var:,=”S“S!”
设置“变量=!变量:^,^,=,!”
设置“var=!var:”“=!”
设置“var=!var:“Q=!”
对于/F“tokens=1-3 delims=,”%%a in(“!var:“S”S=“,”!”)Do(
端部
回显%%a、%%~b、%%~c
setlocal EnableDelayedExpansion
暂停
)
端部
)
这有点棘手,因为多份熟食将浓缩为一份熟食
因此,您需要先将它们替换为唯一的delim序列
@Echo Off
setlocal DisableDelayedExpansion
For /F "usebackq tokens=1-3 delims=" %%a in (test.csv) Do (
set "line=%%a"
setlocal EnableDelayedExpansion
set "line="!line:,=","!""
For /F "tokens=1-3 delims=," %%a in ("!line!") Do (
echo %%~a, %%~b, %%~c
)
)
这会将每列括在引号中,使用%%~a
将在以后删除引号
编辑:嵌入逗号的解决方案
在这种情况下,它只是有点不同的解决方案
@echo关闭
setlocal DisableDelayedExpansion
对于/F“usebackq tokens=1-3 delims=“%%x in(test.csv)Do(
设置“var=%%x”
setlocal EnableDelayedExpansion
设置“var=!var:^=^^!”
设置“var=!var:&=^&!”
设置“变量=!变量:|=^ |!”
设置“var=!var:!”
设置“var=!var:,=^,^,!”
rem**这是关键行,缺少的报价是意图
调用集变量=%%var:“”%%
设置“var=!var:=”Q!“
设置“var=!var:^,^,=”C!“
设置“变量=!变量:,=,!”
设置“var=!var:”“=!”
设置“var=”!var:,=“,!”
对于/F“tokens=1-3 delims=,”%%a in(“!var!”)do(
端部
设置“col1=%%~a”
设置“col2=%%~b”
设置“col3=%%~c”
setlocal EnableDelayedExpansion
如果定义为col1(
设置“col1=!col1:“C=,!”
设置“col1=!col1:”Q=“!”
)
如果定义col2(
设置“col2=!col2:“C=,!”
设置“col2=!col2:”Q=“!”
)
如果定义为col3(
设置“col3=!col3:“C=,!”
设置“col3=!col3:”Q=“!”
)
回声a=!col1!,b=!col2!,c=!col3!
端部
)
)
使用像SED这样的字符串编辑器,我已经克服了这个问题,我创建了一个临时文件,将“,”替换为“,-,”两次,然后将“-”视为原始文件中的一个空字段
ssed "s/,,/,-,/ig;s/,,/,-,/ig" file1.csv > file1.tmp
然后正确分配令牌。如果需要编辑临时文件,然后返回CSV,请使用
ssed "s/,-,/,,/ig;s/,-,/,,/ig" file1.tmp > file1.csv
这似乎比使用令牌替换飞行中的字符串和使用子例程等简单得多。但如果名称中有逗号,则不起作用。.如何修复。.感谢您的帮助。然后,您应该展示您的csv是如何使用名称格式化的,包括逗号(可能是
“Smith,John”,m,25
?)是的,对此我深表歉意。你能告诉我如何解决这个问题吗?我会修改我的问题;-)更复杂,类似的问题在解决了,请检查我的更新代码。我一直在努力寻找解决方案。请解释一下。提前谢谢。