2011-01-11 75 views
0

我是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; 

回答

10

打开文件+>>模式将寻求到文件的末尾,这样就会有东西可读,除非你seek回文件的开头(或中间)。要使用文件光标在文件开头处以读/写模式打开,请使用+<模式。

这就是说,你可能想重新思考你对这个问题的方法。它看起来像你正试图读取一行数据,修改它,并将其写回到文件中。但是,你已经完成了这项工作,你将覆盖数据行而不是刚刚读取的行,并且无论如何新数据比旧数据更长(包含更多字节)。这肯定会损坏您的数据文件。

一些更好的方法可能是

  • 读取和处理的所有数据,然后再关闭和处理完成的数据

  • 写入数据覆盖输入到一个临时文件,而你正在处理它,然后用临时文件覆盖输入(另请参阅关于perl解释器的输入in-place editing mode

  • 使用像Tie::File这样的模块来处理基于行的I/O这个任务

+0

当我使用+ <写控制台写入时卡住了。另一件事是我不想修改所有的行。我只想写入满足条件的特定行。所以写入一个不同的文件或存储将成为一个问题。有没有更好的办法 ? – mousey 2011-01-11 18:36:44