我是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;
答案 0 :(得分:10)
以+>>
模式打开文件将寻找文件的末尾,因此除非seek
回到文件的开头(或中间),否则无需读取任何内容。要以文件光标位于文件开头的读/写模式下打开,请使用+<
模式。
那就是说,您可能想重新考虑一下这个问题。看起来您正在尝试读取一行数据,修改它并将其写回文件。但是你完成它的方式是覆盖 next 数据行而不是你刚读过的行,而且新数据比旧数据更长(有更多字节)。这肯定会破坏您的数据文件。
一些更好的方法可能是
首先读取并处理所有数据,然后关闭并用处理过的数据覆盖输入
在处理数据时将数据写入临时文件,然后使用临时文件覆盖输入(另请参阅perl解释器的in-place editing mode)
使用Tie::File
之类的模块来处理此任务的基于行的I / O