迭代匹配文本文件中的线条图案然后解析N行

时间:2016-08-25 17:45:00

标签: perl parsing iteration

我有一个包含三列的文本文件。使用perl,我试图遍历文本文件并搜索特定模式...

逻辑: IF column2 = 00z24aug2016 & column3 = e01。当匹配此模式时,我需要解析匹配的行,然后解析下一行3行。到新文件。

文字档案:

site1,00z24aug2016,e01
site1,00z24aug2016,e01
site1,00z24aug2016,e01
site1,00z24aug2016,e01
site2,00z24aug2016,e02
site2,00z24aug2016,e02
site2,00z24aug2016,e02
site2,00z24aug2016,e02

期望的输出......

新文件1:

site1,00z24aug2016,e01
site1,00z24aug2016,e01
site1,00z24aug2016,e01
site1,00z24aug2016,e01

新文件2:

site2,00z24aug2016,e02
site2,00z24aug2016,e02
site2,00z24aug2016,e02
site2,00z24aug2016,e02

1 个答案:

答案 0 :(得分:3)

根据您对zdim和Borodin的回应,您似乎要求提供有关如何使用Perl而非实际工作代码的指示,所以我在此基础上回答。

您在问题的“逻辑”部分中描述的内容在Perl中非常简单明了 - 实际代码将远远短于此描述:

  • 使用use strict; use warnings;启动您的程序 - 这将捕获最常见的错误并使调试更加更容易!
  • 打开输入文件以进行阅读(open(my $fh, '<', $file_name) or die "Failed to open $file_name: $!"
  • 读入文件的每一行(my $line = <$fh>;
  • (可选)使用chomp删除行结尾
  • 使用split将行划分为字段(my @column = split /,/, $line;
  • 检查第一个和第三个字段的值(请注意,数组从0开始计数,而不是从1开始计数,因此它们将是$column[1]$column[2]而不是2和{{ 1}})
  • 如果字段值符合您的条件,请将计数器设置为4(要输出的总行数)
  • 如果计数器大于零,则输出原始3并递减计数器
  • 逻辑提到“新文件”,但未指定何时应创建新输出文件以及何时应继续将输出发送到同一文件。由于没有指定,我忽略了它并描述了所有输出到一个目的地。

但请注意,您的样本所需输出与所描述的逻辑不匹配。根据指定的逻辑,输出应包括示例数据的前七行,但不包括最后一行(因为它前面的三行中没有一行包含“e01”)。

因此。获取此信息以及您可能已经了解的有关Perl的任何信息,并尝试编写解决方案。如果您达不到如何取得进一步进展的地步,请发布一个包含代码副本和输入数据的新问题(或更新此问题),以便我们自己运行,并说明如果它无法正常工作,那么我们将能够更有能力帮助您处理这些信息(如果您能证明您已经努力首先自己完成这项工作,那么更多的人愿意提供帮助。)