2014-01-08 68 views
0

我有兩打.csv文件,每個文件大約有一千行,它們是用Tie :: Array :: CSV創建的。現在我想每天追加一行或兩行,最有效的方法是什麼?如何用perl追加csv文件的行

我想我可以讀取每個文件到數組中,添加我的數據,並將數組重新寫入csv,但這意味着如果在覆蓋過程中出現問題,則可能丟失所有數據,並且如果創建新文件,我需要找出一些系統來自動管理所有那些每天都在堆積的副本。

如果沒有附加行的模塊,如何手動執行正確的csv所需的所有約定和轉義字符,以便可以毫無問題地將它們讀回perl?

...

感謝答覆,我沒有足夠的信譽來添加註釋,直接的答案,所以我eidted原來的問題。我不擔心丟失太多數據,我可以從頭開始重建它,它只需要時間和人工干預,但不足以保證運行日常備份系統,認爲這總是需要考慮的一點。追加行應該更容易處理時間,因爲在我的機器上寫入.csv到磁盤相對較慢。

以追加模式打開文件是我不知道的。通過解決方案包含$csv->print($fh, $row);我應該通過循環來添加多條線嗎?

我得提出了Perlmonks

use Tie::Array::CSV; 
my $filename = 'tied.csv'; 
tie my @file, 'Tie::Array::CSV', $filename; 
push(@file,[4,5,6]); 
untie @file; 

將這項工作更好的另一個解決方案?我現在沒有機會測試它。

編輯。推()解決方案上面的工作魔術。考慮這個關閉。

+0

如果您擔心丟失數據,請投資備份。 –

+0

從'perldoc -f open',出現以下文本:'如果MODE是>>,則打開該文件以進行追加,並在必要時再次創建。 –

回答

7

使用Text::CSV

use Text::CSV; 

my $csv = Text::CSV->new({ binary => 1, auto_diag => 1, eol => "\n"}) 
     or die "Cannot use CSV: " . Text::CSV->error_diag(); 

# open in append mode 
open my $fh, ">>", "file.csv" or die "Failed to open file: $!"; 

$csv->print($fh, [ "foo", "bar", "foo,bar" ]); 

close $fh; 

此追加使用\n作爲EOL字符,逗號作爲字段分隔符(這是默認值)的單個線file.csv,和引號字段包含逗號:

foo,bar,"foo,bar"