0

我可以在 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 处理的完整多行记录,但是我收到错误

  • 使用?模式?在第 10 行不推荐使用无显式运算符。
  • 全局符号“$patstring”在第 10 行需要明确的包名。
  • 搜索模式未在第 10 行终止。

我试图只获取看起来像这样的分隔文本进行记录,不包括开头和结尾的引号我希望这是有道理的:

“描述”“Star-Lite 2-Person w/Fly Aluminum, Rust

规格:

  • 包装尺寸:13"" X 5""
  • 1 门
  • 室内面积:41.25 平方英尺
  • 峰高:44""
  • 地板材质:190T涤纶,2000mm PU涂层
  • 网格:没看到-嗯
  • 极数:2 根 8.5 毫米的防震铝线。
  • 极部分:12"" 长度。
  • 包括雨蝇。
  • 90"" X 66"" X 44"""

排除我只想要的第一行

Star-Lite 2 人带飞铝,生锈

规格:

  • 包装尺寸:13"" X 5""
  • 1 门
  • 室内面积:41.25 平方英尺
  • 峰高:44""
  • 地板材质:190T涤纶,2000mm PU涂层
  • 网格:没看到-嗯
  • 极数:2 根 8.5 毫米的防震铝线。
  • 极部分:12"" 长度。
  • 包括雨蝇。
  • 90"" X 66"" X 44""

我需要做什么来修复这个模块的模式?

编辑:粘贴了错误的脚本

4

2 回答 2

1

A bit inelegant, but this will do what I think you want to do:

#!/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";  
}
于 2012-09-23T19:33:46.210 回答
0
Global symbol "$patstring" requires explicit package name at line 10.

您对变量有严格要求并忘记声明$patstring变量。

Use of ?PATTERN? without explicit operator is deprecated at line 10

gen_delimited_pa​​t接受一个字符串。你已经通过了它......好吧,你已经通过了它一个语法错误。我想它应该是一个正则表达式?Perl 绝望地试图将其解析为?PATTERN? 使用单个问号然后放弃。

你给出的例子都不应该奏效。两者都包含上述相同的错误。没有调用 Text::Balanced 函数gen_delimited_patq(它是gen_delimited_pat),也没有从 Text::Balanced 导出正确的函数,并且$patstring从未使用过。

于 2012-09-23T18:35:06.497 回答