我有一个.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"
抱歉,我在批处理脚本中非常基础,提前谢谢
答案 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"
但是,如果有些行没有示例数据的格式(可以使用正则表达式正确处理,但不能使用此代码),则可能需要对此代码进行调整。请注意,根据数据的差异,问题可能无法通过纯批处理文件解决。