将正则表达式匹配作为新列添加到csv文件[Batch Scripting]

时间:2016-03-05 20:32:17

标签: regex csv batch-file command-line

我有一个.csv文件,我需要在每行中添加正则表达式匹配作为原始列之后的新列,这里是.csv文件的一部分:

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

这是两个正则表达式模式我想将每行的提取结果添加为新列(每列一列)

(?<=Product\s)\w.*?(?=\s*\(Shop)

(?<=Shop ID:\s)\w.*?(?=\))

数据的结果应该是这样的(标题行并不重要):

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

抱歉,我在批处理脚本中非常基础,提前谢谢

3 个答案:

答案 0 :(得分:1)

Windows批处理没有本机正则表达式查找/替换实用程序。唯一的正则表达式实用程序是FINDSTR,这是非常有限和非标准的,它只能打印出与搜索匹配的整行 - 它不能打印出匹配的部分。

您可以使用PowerShell。

但我会使用JREPL.BAT - 一个纯粹的基于脚本的实用程序(混合JScript /批处理),可以在XP以后的任何Windows机器上运行。它使用ECMA正则表达式,因此没有后视,但它有足够的能力来完成任务。

jrepl "Product\s(\S+?)\s*\(Shop ID:\s(.*?)\)\q$" "$&;\q$1\q;\q$2\q" /a /x /f test.csv /o -

/a开关丢弃未更改的行,这有效地删除了标题行。 /o -选项用输出覆盖原始文件。 /x开关启用扩展转义序列,从而为\q启用"

如果将命令放在批处理脚本中,请使用call jrepl

可以从命令行通过jrepl /?jrepl /??获取完整文档以获取分页输出。

答案 1 :(得分:0)

您可以使用此GNU sed命令执行此操作:

sed -r 's/^.*Product (.+) \(Shop ID: (.+)\)"$/&;\"\1\";\"\2\"/g' shop.csv
  • 它会将Product(Shop ID:)"之间的部分捕获到\1\2
  • 替换使用&(整行)并附加由\1\2
  • 组成的字符串

答案 2 :(得分:0)

如果没有使用此批处理文件的正则表达式,可以通过一种非常简单的方式解决此问题:

@echo off

(for /F "skip=1 tokens=1-3 delims=;" %%a in (input.csv) do (
   for /F "tokens=3,6 delims=() " %%d in (%%c) do (
      echo %%a;%%b;%%c;"%%d";"%%e"
   )
)) > output.txt
move /Y output.csv input.csv

结果:

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

但是,如果有些行没有示例数据的格式(可以使用正则表达式正确处理,但不能使用此代码),则可能需要对此代码进行调整。请注意,根据数据的差异,问题可能无法通过纯批处理文件解决。