удаление совпавшей строки с помощью модуля CSV в Perl - PullRequest
0 голосов
/ 13 октября 2011

Пока что я выяснил, как сопоставить строку из CSV-файла с помощью этого модуля perl, Text::CSV_XS. Мне нужна помощь, чтобы удалить эту строку в файле. Есть простой способ сделать это? Есть ли способ сделать это в этом модуле?

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

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

    if ($row->[0] =~ m/ABCDE/)
    {
      print "We have a match, remove the line \n";
    }
    else
    {
        print "No match found\n";
    }
}
$csv->eof or $csv->error_diag ();
close $fh;

Ответы [ 4 ]

2 голосов
/ 13 октября 2011

Единственный способ удалить содержимое из файла - это прочитать файл и записать новое содержимое.Обычный способ сделать это - открыть другой файл для записи, прочитать записи из входного файла и записать только те записи, которые вы хотите сохранить в выходной файл.Затем закрыть оба, отменить или переименовать оригинал (в зависимости от того, хотите ли вы сохранить резервную копию), а затем переименовать выводфайл с исходным именем входного файла.

2 голосов
/ 13 октября 2011

Не похоже, что этот модуль может сделать это, но есть ряд других модулей Perl, которые могут:

См. Ссылки для документации и примеров.

0 голосов
/ 29 октября 2018

Во-первых, я бы просто проанализировал файл CSV.

use Text::CSV_XS qw( csv );
$parsed_file_array_of_hashesv = csv(
    in      => "$input_csv_filename",
    sep     => ';',
    headers => "auto"
);    # as array of hash

Во-вторых, когда у вас есть $ parsed_file_array_of_hashesv , теперь вы можете зациклить этот массив в perl и обнаружить строку, которую выхотите удалить из массива.а затем удалите его, используя

, сращивание ARRAY, OFFSET, LENGTH

удаляет что-либо из индекса OFFSET через индекс OFFSET + LENGT

давайте предположим, что индекс 0

my @extracted_array = @$parsed_file_array_of_hashesv;    #dereference hashes reference
splice @extracted_array, 0, 1;#remove entry 0
$ref_removed_line_parsed = \@extracted_array;            #referece to array

В-третьих, запишите обратно массив в файл CSV

$current_metric_file    = csv(
    in      => $ref_removed_line_parsed,                 #only accepts referece
    out     => "$output_csv_filename",
    sep     => ';',
    eol     => "\n",                                   # \r, \n, or \r\n or undef
    #headers => \@sorted_column_names,              #only accepts referece
    headers => "auto"
); 

Обратите внимание, что если вы используете \ @sorted_column_names, вы сможете контролировать порядок столбцов

my @sorted_column_names;
foreach my $name (sort {lc $a cmp lc $b} keys %{ $parsed_file_array_of_hashesv->[0] }) { #all hashes have the same column names so we choose the first one
    push(@sorted_column_names,$name);
}

Это должно записать файл CSV без вашей строки.

0 голосов
/ 13 октября 2011

Я не уверен, что Text :: CSV_XS позволяет вам удалять строки. Я не думаю, что это так.
Один из способов удалить строку - это когда вы читаете строки в своих циклах while, просто сохраняйте нужные строки.
После того, как вы закроете файл, просто замените его всеми строками, которые вы хотите сохранить в файле.
Таким образом, в вашем случае все, что не соответствует ABCDE, должно быть сохранено, а затем записано обратно в тот же файл.
Таким образом, вы в конечном итоге прочитаете 10 строк и напишите обратно 9 (при условии, что в одной строке был ABCDE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...