чтение входного файла, сопоставление и удаление данных и запись оставшихся строк в новый файл

#perl

#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:

Откройте выходной файл вне цикла. По мере чтения каждой строки решайте, хотите ли вы ее сохранить. Если да, выполните запись в выходной файл. Если нет, ничего не делайте.

Что-то вроде следующего (непроверенное):

 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: %sn", 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";
  

Комментарии:

1. спасибо за вашу помощь. Это работает хорошо. Можно ли управлять форматированием печати $csv->print($outfh, $row) при создании нового файла? еще раз спасибо

2. Я не уверен, что вы подразумеваете под управлением форматированием печати. Можете ли вы привести пример?

3. извините за путаницу. формат на самом деле в порядке. что произошло, так это то, что при записи в новый файл новый файл представляет собой больше текста ascii без всей кодировки utf8. это действительно лучший входной файл для работы. Спасибо.

4. Если вам нужна конкретная кодировка, вы должны иметь возможность указать ее при открытии выходного файла.