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

时间:2014-06-08 05:34:58

标签: batch-file csv

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

这是一个带有问题的简化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"次出现。

我能够在每行中隔离列并设置非零替换变量:

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变量,看起来似乎有更好的方式我看不到......

任何见解都将受到赞赏。

2 个答案:

答案 0 :(得分:0)

使用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

另外一些特殊字符也会造成麻烦。

答案 1 :(得分:0)

这应该是一种强大而快速的方法:

这使用名为repl.bat的助手批处理文件(由dbenham提供) - 从以下网址下载:https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

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

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