我可以在csv文件上运行以下命令,以便从文件中获取分隔文本。
#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced q/extract_delimited/;
my $filecontents = do { local $/; <> };
while (my $item = extract_delimited($filecontents, '"')) {
print "Item: $item\n";
}
但结果总是包含引号,这是我不想要的,所以我尝试了以下内容来完全隔离多行记录
#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/gen_delimited_pat/;
my $filecontents = do { local $/; <> };
$patstring = gen_delimited_patq(\G(?:[^"]|""|""")* ]))
while (my $item = extract_delimited($filecontents, '"')) {
print "Item: $item\n";
}
因为我知道这个正则表达式
\G(?:[^"]|""|""")*
找到我想用Text :: Markdown处理的完整多行记录但是我得到错误
我试图只获取记录的分隔文本,看起来像这样,不包括开头和结尾的引用,我希望这是有道理的:
“说明” “Star-Lite 2人用飞铝,铁锈
规格:
排除我只想要的第一行
Star-Lite 2人用飞铝,铁锈
规格:
我需要做些什么来修复此模块的模式?
编辑:粘贴了错误的脚本
答案 0 :(得分:1)
有点不优雅,但这会做我认为你想做的事情:
#!/usr/bin/perl
use strict;
use warnings;
use Text::Balanced qw/extract_delimited extract_multiple/;
my $filecontents = do { local $/; <> };
#replace newlines with pipes
$filecontents=~s/\n/\|/g;
$filecontents=~s/""/inches/g;
#grab all your delimited substrings into an array
my @extracted = extract_multiple($filecontents,
[ sub {extract_delimited ($_[0],q{"})}],
undef, 1);
foreach my $fragment(@extracted){
#remove "
$fragment=~s/"//g;
$fragment=~s/inches/""/g;
$fragment=~s/\|/\n/g;
print "$fragment\n";
}
答案 1 :(得分:0)
Global symbol "$patstring" requires explicit package name at line 10.
您已启用strict并忘记声明$patstring
变量。
Use of ?PATTERN? without explicit operator is deprecated at line 10
gen_delimited_pat需要一个字符串。你已经通过了......好吧,你传递了一个语法错误。我想这应该是一个正则表达式?无奈之下,Perl试图使用单个问号将其解析为?PATTERN?,然后放弃。
你提供的任何一个例子都不应该有效。两者都包含上述相同的错误。没有名为gen_delimited_patq
的Text :: Balanced函数(它是gen_delimited_pat
),既没有从Text :: Balanced导出正确的函数,也从未使用$patstring
。