读取输入文件,匹配并删除数据并将剩余行写入新文件

时间:2011-10-13 22:07:53

标签: perl

我试图让这个写出文件的内容。我要做的是打开一个输入文件,过滤掉/删除匹配的行并写入新文件。有人能告诉我如何正确地做到这一点吗?感谢。

use strict;
use warnings;
use Text::CSV_XS;

my $csv = Text::CSV_XS->new ({ binary => 1 }) or
     die "Cannot use CSV: ".Text::CSV_XS->error_diag ();
open my $fh, "<:encoding(UTF-16LE)", "InputFile.txt" or die "cannot open file: $!";

my @rows;
while (my $row = $csv->getline ($fh)) {
    my @lines;
    shift @lines if $row->[0] =~ m/Global/;

    my $newfile = "NewFile.txt";

    open(my $newfh, '>', $newfile) or die "Can't open";
    print $newfh @lines;

    }
$csv->eof or $csv->error_diag ();
close $fh;

1 个答案:

答案 0 :(得分:3)

在循环外打开输出文件。当您阅读每一行时,请确定是否要保留它。如果是,请写入输出文件。如果没有,请不要做任何事情。

类似以下内容(未经测试):

use strict;
use warnings;
use Text::CSV_XS;

my ($input_file, $output_file) = qw(InputFile.txt NewFile.txt);

my $csv = Text::CSV_XS->new ({ binary => 1 })
    or die sprintf("Cannot use CSV: %s\n", Text::CSV_XS->error_diag);

open my $infh, "<:encoding(UTF-16LE)", $input_file
    or die "Cannot open '$input_file': $!";

open my $outfh, '>', $output_file
    or die "Cannot open '$output_file': $!";

while (my $row = $csv->getline($infh)) {
    next if $row->[0] =~ m/Global/;
    unless ( $csv->print($outfh, $row) ) {
        die sprintf("Error writing to '%s': %s",
            $output_file,
            $csv->error_diag
        );
    }
}

close $outfh
    or die "Cannot close '$output_file': $!";

close $infh
    or die "Cannot close '$input_file': $!";

$csv->eof
    or die "Processing of '$input_file' terminated prematurely";