我有一个分号&#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)"
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为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 -