我有二十几个.csv文件,每个文件大约有一千行,它们是用Tie :: Array :: CSV创建的.现在我想每天为每一个添加一行或两行,最有效的方法是什么?
我想我可以将每个文件读入一个数组,添加我的数据,然后再将数据写回csv,但这意味着如果在覆盖期间出现问题,我可能会丢失所有数据,如果我创建新文件,我需要弄清楚一些系统自动管理每天堆积的所有副本副本.
如果没有模块可以追加行,那么如何使用所有约定和正确csv所需的转义字符手动完成它们,以便它们可以毫无问题地读回perl?
...
感谢您的回复,我没有足够的声誉直接为答案添加评论,所以我找到了原来的问题.
我不担心丢失我的数据太多,我可以从头开始重建它,它只需要时间和人工干预,但不足以保证运行每日备份系统,认为它总是需要考虑的一点.在处理时间上添加行也应该更容易,因为在我的机器上将.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;
Run Code Online (Sandbox Code Playgroud)
那会更好吗?我现在没有机会测试它.
编辑.Push()解决方案高于工作魔力.考虑这个结束.
使用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;
Run Code Online (Sandbox Code Playgroud)
这个追加单线以file.csv使用\n作为EOL字符,逗号作为字段分隔符(这是默认值),并且引号包含逗号字段:
foo,bar,"foo,bar"
Run Code Online (Sandbox Code Playgroud)