我有以下格式的csv;
"12345"|"ABC"|"ABC"[tab delimeter]
"12345"|"ABC"|"ABC"[tab delimeter]
"12345"|"ABC"|"ABC"[tab delimeter]
但是,文本中还会显示标签,我需要删除不以“。”开头的标签。
我有以下正则表达式,突出显示没有后跟的标签
\t[^\"]
但这也突出了标签后的字符,我只想选择并删除标签。
注意:不确定这是否重要,但我在运行Perl之前在TextPad中运行命令。
答案 0 :(得分:1)
使用这个:
\t(?!")
这意味着tab
字符后面没有"
字符。
答案 1 :(得分:1)
如果您无法下载Text::CSV
等适当的CSV模块,则可以使用属于核心部分的轻量级替代方案:Text::ParseWords
:
use strict;
use warnings;
use Text::ParseWords;
while (<DATA>) {
my @list = quotewords('\t', 1, $_);
tr/\t//d for @list;
print join "\t", @list;
}
__DATA__
"12345"|"ABC "|"ABC" next field
"12345"|"ABC"|" ABC" next field
"123 45"|"ABC"|"ABC" next field
(注意:制表符可能已被stackoverflow格式化破坏)
这将解析行并忽略引用的标签。然后我们可以简单地删除它们并将线重新组合在一起。
答案 2 :(得分:0)
嗯,最简单的方法是使用负面的后视......
s/(?<!")\t//g;
...因为它只匹配tab
字符之前前面 "
字符的s/([^"])\t/$1/g;
个字符。但是如果你的perl不支持它,不要担心 - 还有另一种方式:
"
...也就是说,仅用该符号替换任何非\t
符号后跟{{1}}。