Batch file 使用批处理脚本将CSV中特定列中的空值替换为0

Batch file 使用批处理脚本将CSV中特定列中的空值替换为0,batch-file,csv,Batch File,Csv,我需要准备一个自动生成的CSV文件导入数据库。其中一列应该包含整数,但生成程序(我无法控制)并不总是在该列中放入任何内容。数据库导入不接受整数列中的空值。还有其他字符串列应保持为空 下面是一个简化的CSV,其中有一个问题: "UID","Name","Comment","LicenseNo","DateEntered" "1","Adam","Likes puppies","4451","2014-05-01" "2","Barbara","","",2014-05-02" "3","","Re

我需要准备一个自动生成的CSV文件导入数据库。其中一列应该包含整数,但生成程序(我无法控制)并不总是在该列中放入任何内容。数据库导入不接受整数列中的空值。还有其他字符串列应保持为空

下面是一个简化的CSV,其中有一个问题:

"UID","Name","Comment","LicenseNo","DateEntered"
"1","Adam","Likes puppies","4451","2014-05-01"
"2","Barbara","","",2014-05-02"
"3","","Reserved","","2014-05-03"
"4","Donna","","4559","2014-05-04"
我只想将第4列中出现的
替换为
“0”

我可以尽可能地隔离每行中的列,并设置一个非nil替换变量:

set inputCSV=%1
set outputCSV=%2

for /f "delims==" %%a IN (%inputCSV%) DO (
    set line=%%a
    for /f "tokens=4 delims=," %%b IN ("!line!") DO (
        if %%b=="" (
            set data="0"
        ) else (
            set data=%%b
        )
    )
)
但是,我不知道如何将更正的行输出到新文件。我正准备插入如下内容:

if !data!=="0" (
for /f "tokens=1-3 delims=," %%d IN ("!line!") DO set prev=%%d,%%e,%%f
for /f "tokens=5 delims=," %%g IN ("!line!") DO set next=%%g
echo !prev!,!data!,!next! >> %outputCSV%
) else (
echo !line! >> %outputCSV%
)
但是真正的CSV有几十列,所以我将用完FOR变量,而且似乎有一种更好的方式我看不见


如果您有任何见解,我们将不胜感激。

使用
tokens=1-4,*

*
表示“第五个令牌是行的其余部分”

完整代码:

@echo off
setlocal enabledelayedexpansion
set inputCSV=%1
set outputCSV=%2

(for /f "tokens=1-4,* delims=," %%a IN (%inputCSV%) DO (
    if "%%d"=="""" (set "value="000"") else (set "value=%%d")
    echo %%a,%%b,%%c,!value!,%%e
))>%output.csv
编辑注释中的附加信息

@echo off
setlocal enabledelayedexpansion
set inputCSV=%1
set outputCSV=%2

(for /f "tokens=*" %%a IN (%inputCSV%) DO (
  set column=0
  set "line="
  for %%i in ( %%a ) do ( 
    set /a column+=1
    set value=%%~i
    if !column!==4 (   
      if "!value!"=="" set "value=0"
    ) 
    set "line=!line!,"!value!"" 
  )
  echo !line:~1!
))>%outputCSV%
4
更改为正确的列号

注意:每行字符数有一个限制(不记得有多少,可能会影响
%%a


此外,一些特殊字符也会制造麻烦。

这应该是一种可靠且快速的方法:

这使用了一个名为
repl.bat
(由dbenham提供)的助手批处理文件-下载自:

repl.bat
放在与批处理文件相同的文件夹中,或放在路径上的文件夹中

@echo off
type "file.csv" | repl "^(.*?,.*?,.*?),\q\q,(.*)" "$1,\q0\q,$2" x >"newfile.csv"

如果我只有5列,这就行了——但正如我上面所说,实际的CSV有几十列(实际上超过100列)。我应该澄清一下,需要更改的专栏大约是30篇。不过,我很感激。多少列并不重要,因为
*
会把剩下的都拿走,直到行尾。然而,要更改的列是,行的末尾确实很重要。您可以通过使用另一个
for
和一个计数器来解决这个问题,该计数器解析第一个
for
提供的一行代码,谢谢您--该修订版正好解决了我提出的问题,而且速度非常快。我有一些特殊的字符需要注意(例如,评论中的逗号),但是通过预置一些字符串替换,我能够使它生效。我还能够将该列转换为变量&稍加调整就可以使用它从列中去掉逗号。非常感谢!谢谢——看起来这样可以,但我不希望在混合中添加一个helper批处理文件,而且由于我正在处理的列的数量,我必须添加大约30个
*?
,所以我选择@Stephan的答案。