2014-01-08 33 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"