我需要准备一个自动生成的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变量,看起来似乎有更好的方式我看不到......
任何见解都将受到赞赏。
答案 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"