【问题标题】:How to read a block with/without blank line when the block end with blank line?当块以空行结束时如何读取带有/不带空行的块?
【发布时间】:2023-03-19 06:45:01
【问题描述】:

我的文本文件中有一些块。我假设通过下面的块来构造我的文本
如何通过关键字读取块。(keyword1,keyword2,keyword3,keyword4)。

我有两个问题。
1、有没有什么方法可以有效的取出每个关键词的下一行?
2.不知道keyword3和keyword4之间的内部空行怎么跳转。关键点是定义的块以空白结尾。

**block start**

    Keyword1
    Single Line  # I need work on the line
    Keyword2
    Single or Multiple lines  # I need work on the lines
    Keyword3
    (May be there is single or multiple Blank lines)
    Single or Multiple lines  # I need work on the lines
    (May be there is single or multiple Blank lines)
    Keyword4
    Single or Multiple lines  # I need work on the lines
    Single or multiple Blank line

**block end**

【问题讨论】:

    标签: perl parsing text-parsing


    【解决方案1】:

    如果我了解您的数据,空行不是可靠的指标,因为它们可以出现在关键字文本开始之前、文本之后或根本不出现。如果是这种情况,我认为以“段落模式”阅读文本不会有帮助(通过将$/ 设置为空字符串)。同样,空行无助于(至少不是以简单的方式)识别关键字部分或“块”的开始和结束。

    您将不得不以更细粒度的方式解析文本,但您没有向我们提供足够的信息来提供详细的答案。这是一个简单地按关键字存储非空行的示例:

    use strict;
    use warnings;
    
    my (%data, $keyword);
    
    while (my $line = <DATA>){
        next unless $line =~ /\S/;
        chomp $line;
        if ($line =~ /^Keyword/){
            $keyword = $line;
        }
        else {
            push @{$data{$keyword}}, $line;
        }
    }
    
    __DATA__
    Keyword1
    data1 a
    Keyword2
    data2 a
    data2 b
    data2 c
    Keyword3
    
    
    data3 a
    data3 b
    
    
    Keyword4
    data4 a
    data4 b
    

    【讨论】:

    • 感谢您输入的详细信息。真的帮了我很多。
    【解决方案2】:

    您知道将$/ 设置为“段落模式”的空字符串吗?

    现在对&lt;&gt;readline 的每次调用都会返回一条多行记录,最多包含一个或多个空行,chomp 会从末尾删除它们。

    【讨论】:

    • 我不知道$/。但我几个月前用过&lt;&gt;chomp。谢谢。
    【解决方案3】:

    难道你不能像这样进行多行匹配并使用关键字作为锚点:

    $data =~ /(Keyword1.*?Keyword2.*?Keyword3.*?Keyword4.*?)\n$/sm;
    my $block = $1;
    

    其实你也可以这样做,从每个块中获取数据:

    my @keys = $data =~ /Keyword1(.*?)Keyword2(.*?)Keyword3(.*?)Keyword4(.*?)\n$/sm;
    

    然后你可以去掉每组中的空白行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2013-02-28
      • 2016-04-22
      • 2015-04-15
      • 2018-10-10
      相关资源
      最近更新 更多