【问题标题】:How do I split a text file into blocks using Perl?如何使用Perl将文本文件拆分为块?
【发布时间】:2012-07-14 13:51:23
【问题描述】:

我有一个这样的数据文件:

A1 2 3 4 5
B 1 2 4
B 7 8 9
A6 7 8 9
B 1 2 3
B 5 6 7
A3 6 9 7
B 2 3 3
B 5 6 6

使用 Perl,当解析器遇到 /^A/ 时,如何将文件拆分为一组数组(或任何其他数据结构)? 所以我最终得到了

数组1:

A1 2 3 4 5
B 1 2 4
B 7 8 9

数组2:

A6 7 8 9
B 1 2 3
B 5 6 7

等等

非常感谢。

【问题讨论】:

    标签: arrays perl parsing


    【解决方案1】:

    我不得不重写答案(在重写问题之后)

    @arrays = ();
    while (<>) {
      push(@arrays, []) if /^A/;
      push(@{$arrays[-1]}, $_)
    }
    

    【讨论】:

    • 应该是$arrays[$#arrays] ,或者最好是$arrays[-1]
    • 谢谢! $arrays[-1] ... 不错。
    【解决方案2】:

    有时我希望$/ 不仅仅是一个字符串。不过,有一些解决方法。

    可以使用前瞻断言将文件吞入并进行处理。下面的示例简单地打印了每个以&lt;&lt; &gt;&gt; 分隔的字符串,但无论您想对数据做什么,基本思想都是相同的:

    $ perl -0777 -wE 'say "<<$_>>" for split /(?=^A)/m, <>' file.txt
    <<A1 2 3 4 5
    B 1 2 4
    B 7 8 9
    >>
    <<A6 7 8 9
    B 1 2 3
    B 5 6 7
    >>
    <<A3 6 9 7
    B 2 3 3
    B 5 6 6
    >>
    

    【讨论】:

    • 您需要/m 修饰符,或者/^/ 仅匹配字符串的开头而不是任何行的开头。我已经编辑了你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2017-07-13
    • 2013-02-23
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2021-12-06
    相关资源
    最近更新 更多