2016-03-06 105 views
-1

我有一个分号“;”带有“”的定界CSV文件作为文本量化器,但是有些字段有“;”或“”打破了界限;如何使用批处理脚本在每行中的每个字段中替换这些值,但使字段分隔符(;)和文本量词(“”)保持相同? (示例在每个字段中用“|”和双引号单引号替换“;”)使用批处理脚本在CSV字段中搜索和替换文本

注意:我们可以依赖“;”每两个场之间部分(开始和每个字段的结束具有双引号,可以使用它作为假想定界符在溶液中)

这里作为我的CSV行的已损坏的字段的一个示例:

"Event";"User";"Description" 
"stock_change";"[email protected]";"Change Product Teddy;Bear (Shop ID: "AR832H0823")" 
"stock_update;change";"[email protected]";"Update Product "30142_Pen" (Shop ID: GI8759)" 
+0

这不是一个问题,而是一个任务请求;请分享您迄今为止所尝试的内容;请记住,SO不是免费的写作服务...... – aschipfl

回答

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循环将三个字段传递给过程:过程。线各自的形式是“DATA1” 隔板“DATA2” 隔板“DATA3”

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

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

更换所有冒号后,根据需要替换分号和兔耳,然后在输出数据到目标文件的echo中,用冒号替换''

这产生了一些假设,包括数据不包含%或其他尴尬的字符,并且数据中没有::的实例。

0

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

截至https://stackoverflow.com/a/35822437/1012053在评论的要求,你可以用我JREPL.BAT utility/T选项执行以下查找/替换(前面查找/替换优先):

  • "在行的开头,或";"在任何地方,或者"在行尾==>离开为我们
  • "其他任何地方==>转换为'
  • ;任何地方ELS Ë==>转换为|
jrepl "^\q|\q;\q|\q$ \q ;" "$& ' |" /x /t " " /f test.csv /o -