首页 > 解决方案 > 仅当以 Perl 中的给定字符串开头时,才将一行从一个文件写入另一个文件

问题描述

我想用 Perl 编写一个程序,逐行读取文件并将这些行写入另一个文件。输入文件具有集合中的数据(类似于一组行,其中一行以 START 开头,另一行以 END 开头)。从,开始到结束,它是一个集合。每组中的行数可能会变化,也可能不会变化。

我想将每个集合写入不同的文件(file_1.txt、file_2.txt 等)

示例:输入文件:

START123
DET1
DET2
END123
START123
DET1
DET2
DET3
END123

为此,我希望为每组创建 2 个文件。

注意:输入文件中有 940,000 行。大约100,000套。

编辑:

确切地。下面是创建唯一文件,但不写入文件。我在这里想念什么?

use strict;
use warnings;

# Open Input file
open my $fh_i, "<", "input.txt" or die $!;

# Flag to check if we are inside the block
my $in_block = 0;
my $counter = 0; #Dynamic Filenaming for each Set
my $filename = "output_1.txt"; #Initial filename

# Read line by line into default variable ($_)
while( <$fh_i> ) {
   $in_block = 0 if /^END/;
   
   # Print to target file if we are inside the block
   open (my $fh_o, ">", $filename) or die $!;
   print $fh_o $_ if $in_block;
            
   close $fh_o if /^START/;
   $in_block = 1 if /^START/;
   $counter = $counter + 1 if /^START/;
   $filename = "output_".$counter.'.txt' if /^START/;
}

close $fh_i;

标签: perlsplit

解决方案


当与 match 运算符一起使用时,该..运算符提供类似于块匹配的状态,如下所示:

while (<>) {   
    If (/^START/ .. /^END/) {
        # Inside block

推荐阅读