读取和写入文件

时间:2011-01-11 18:10:24

标签: perl csv

我是perl的新手,我正在尝试读取和写入perl中的csv文件。但没有任何事情可以帮助我解决问题所在。使用'<'我可以毫无问题地阅读但我无法写作。

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 个答案:

答案 0 :(得分:10)

+>>模式打开文件将寻找文件的末尾,因此除非seek回到文件的开头(或中间),否则无需读取任何内容。要以文件光标位于文件开头的读/写模式下打开,请使用+<模式。

那就是说,您可能想重新考虑一下这个问题。看起来您正在尝试读取一行数据,修改它并将其写回文件。但是你完成它的方式是覆盖 next 数据行而不是你刚读过的行,而且新数据比旧数据更长(有更多字节)。这肯定会破坏您的数据文件。

一些更好的方法可能是

  • 首先读取并处理所有数据,然后关闭并用处理过的数据覆盖输入

  • 在处理数据时将数据写入临时文件,然后使用临时文件覆盖输入(另请参阅perl解释器的in-place editing mode

  • 使用Tie::File之类的模块来处理此任务的基于行的I / O