我有二十几个.csv文件,每个文件长约一千行,它们是用Tie :: Array :: CSV创建的。现在我想每天为每一行添加一两行,最有效的方法是什么?
我想我可以将每个文件读入一个数组,添加我的数据,然后再将数据写回csv,但这意味着如果在覆盖期间出现问题,我可能会丢失所有数据,如果我创建新文件,我需要计算一些系统可以自动管理每天堆积的所有副本副本。
如果没有附加行的模块,如何使用正确的csv所需的所有约定和转义字符手动完成它们,以便它们可以回读到perl而没有问题?
...
感谢您的回复,我没有足够的声誉直接为答案添加评论,所以我找到了原来的问题。
我不担心丢失我的数据太多,我可以从头开始重建它,只需要时间和人工干预,但不足以保证运行每日备份系统,认为它总是需要考虑的一点。在处理时间上添加行也应该更容易,因为在我的机器上将.csv写入磁盘的速度相对较慢。
以追加模式打开文件是我不知道的。如果解决方案是$csv->print($fh, $row);
,我应该通过一个循环来运行它来添加多行吗?
use Tie::Array::CSV;
my $filename = 'tied.csv';
tie my @file, 'Tie::Array::CSV', $filename;
push(@file,[4,5,6]);
untie @file;
那会更好吗?我现在没有机会测试它。
EDIT。 Push()解决方案高于工作魔力。考虑这个结束。
答案 0 :(得分: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;
使用file.csv
作为EOL字符,逗号作为字段分隔符(这是默认值),并在包含逗号的字段周围引用,向\n
添加一行:
foo,bar,"foo,bar"