2011-01-11 73 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