Batch file 循环浏览带有批处理空间问题的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

我有一个像这样的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,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
?)是的,对此我深表歉意。你能告诉我如何解决这个问题吗?我会修改我的问题;-)更复杂,类似的问题在解决了,请检查我的更新代码。我一直在努力寻找解决方案。请解释一下。提前谢谢。