搜索&使用批处理脚本替换CSV字段中的文本

时间:2016-03-06 15:29:08

标签: csv batch-file command-line

我有一个分号&#34 ;;"使用""分隔的CSV文件作为文本量词,但有些字段有&#34 ;;"或""这打破了界限;如何使用批处理脚本在每行的每个字段中替换此类值,但保持字段分隔符(;)和文本量词("")相同? (示例替换";"在每个字段中使用" |"和双引号单引号)

注意:我们可以依靠每两个字段之间的&#34 ;;" 部分(每个字段的开头和结尾都有双引号,可以将它用作虚构的解决方案中的分隔符)

这里是我的带有损坏字段的csv行的示例:

"Event";"User";"Description"   
"stock_change";"usertest1@gmail.com";"Change Product Teddy;Bear (Shop ID: "AR832H0823")"
"stock_update;change";"usertest2@gmail.com";"Update Product "30142_Pen" (Shop ID: GI8759)"

2 个答案:

答案 0 :(得分:0)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q35828741.txt"
SET "outfile=%destdir%\outfile.txt"
FOR /L %%f IN (1,1,3) DO SET "field%%f="
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 FOR %%b IN (%%a) DO CALL :process %%b
)
)>"%outfile%"

GOTO :EOF

:process
IF NOT DEFINED field1 SET "field1=%~1"&GOTO :EOF 
IF NOT DEFINED field2 SET "field2=%~1"&GOTO :EOF 
SET "field3=%~1"
:repcwp
FOR /f "tokens=1*delims=:" %%f IN ("%field3%") DO (
 SET "field3=%%g"
 IF DEFINED field3 (SET "field3=%%f''%%g"&GOTO repcwp) ELSE (SET "field3=%%~f")
)
set "field1=%field1:;=|%"
set "field1=%field1:"='%"
set "field2=%field2:;=|%"
set "field2=%field2:"='%"
set "field3=%field3:;=|%"
set "field3=%field3:"='%"
ECHO "%field1:''=:%";"%field2:''=:%";"%field3:''=:%"
FOR /L %%f IN (1,1,3) DO SET "field%%f="
GOTO :eof

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q35828741.txt的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

处理文件的每一行,假设它构造良好。

使用简单的for循环将三个字段传递给过程:process。这些行的形式分别为“data1”分隔符“data2”分隔符“data3”

:process内,将数据累积到field1..3

由于公共子字符串替换机制使用:来分隔“to”和“from”字符串,因此请用不同的字符串:替换每个''。这仅适用于field3,因为从示例数据中可以看出它是唯一可能包含冒号的字段。如果冒号可能出现在其他领域,那只是跟随弹跳球的问题。

替换了所有冒号后,根据需要替换分号和兔子耳朵,然后在echo中将数据输出到目标文件,用冒号替换任何''

这做了许多假设,包括数据不包含%或其他笨拙的字符,并且数据中没有::的实例。

答案 1 :(得分:0)

我不明白你为什么要将teddy;bear转换为teddy|bear,但是......好的。

根据https://stackoverflow.com/a/35822437/1012053的评论中的要求,您可以使用JREPL.BAT utility/T选项执行以下查找/替换(之前的查找/替换优先级):

  • "位于行首,或";"位于任意位置,或"位于行尾==>离开我们
  • "任何其他地方==>转换为'
  • ;任何其他地方==>转换为|
jrepl "^\q|\q;\q|\q$ \q ;" "$& ' |" /x /t " " /f test.csv /o -
相关问题