读取和写入文件

mou*_*sey 0 csv perl

我是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;
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 10

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

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

一些更好的方法可能是

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

  • 在处理数据时将数据写入临时文件,然后使用临时文件覆盖输入(另请参阅perl解释器的就地编辑模式)

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

  • 通常,如果(1)修改后的数据与原始数据的大小完全相同,或者(2)要修改的数据位于文件末尾,则可以就地修改数据.否则,您将损坏您的数据.不过,看起来你有一个非常典型的任务.为什么不使用典型的解决方案?将处理过的数据保存在内存或临时文件中,然后覆盖输入文件. (4认同)