Как чтение, так и запись в файл - PullRequest
0 голосов
/ 11 января 2011

Я новичок в Perl и пытаюсь читать и писать в CSV-файл в Perl. Но ничего не происходит, может кто-нибудь помочь мне, где проблема. Я могу читать без проблем, используя «<», но не могу писать. </p>

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

my $file = 'file.csv';    
my $csv = Text::CSV_XS->new();

open (InCSV, '+>>', $file) or die $!;
while (<InCSV>) {
    if ($csv->parse($_)) {
        my @columns = $csv->fields();
        if($columns[1] eq "01") {
               my $str = "Selected $columns[6] \n ";
               push(@columns,$str);

               print InCSV join("," , @columns), "\n";
        }                  
    } else {
        my $err = $csv->error_input;
        print "Failed to parse line: $err";
    }
}
close InCSV;

1 Ответ

10 голосов
/ 11 января 2011

При открытии файла в режиме +>> будет выполняться поиск конца файла, поэтому читать нечего, если вы не вернетесь seek к началу (или середине) файла. Чтобы открыть в режиме чтения / записи с помощью курсора в начале файла, используйте режим +<.

Тем не менее, вы, вероятно, хотите переосмыслить свой подход к этой проблеме. Похоже, вы пытаетесь прочитать строку данных, изменить ее и записать обратно в файл. Но так, как вы это сделали, вы перезаписываете строку данных next вместо строки, которую вы только что прочитали, и в любом случае новые данные длиннее (имеют больше байтов), чем старые данные. Это обязательно повредит ваш файл данных.

Некоторые лучшие подходы могут быть

  • сначала прочитать и обработать все данные, затем закрыть и перезаписать ввод обработанными данными

  • запись данных во временный файл во время его обработки, а затем перезапись ввода временным файлом (см. Также о режиме редактирования на месте интерпретатора Perl )

  • использовать модуль типа Tie::File для обработки ввода-вывода на основе строки для этой задачи

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