【问题标题】:How to append lines to csv files with perl如何使用perl将行附加到CSV文件
【发布时间】:2014-01-27 03:49:45
【问题描述】:

我有两打 .csv 文件,每个文件长约一千行,它们是使用 Tie::Array::CSV 创建的。现在我想每天在它们中添加一两行,最有效的方法是什么?

我想我可以将每个文件读入一个数组,添加我的数据,然后再次将数组写回 csv,但这意味着如果在覆盖期间出现问题,我可能会丢失所有数据,并且如果我创建新文件,我需要弄清楚推出一些系统来自动管理所有那些每天都在堆积的副本。

如果没有附加行的模块,如何使用正确 csv 所需的所有约定和转义字符手动执行,以便可以毫无问题地将它们读回 perl?

...

感谢您的回复,我没有足够的声誉直接将 cmets 添加到答案中,所以我取消了原始问题。

我不担心我的数据丢失太多,我可以从头开始重建它,只需要时间和人工干预,但不足以保证运行每日备份系统,我认为这始终是一个值得考虑的问题。附加行在处理时间上也应该更容易,因为在我的机器上将 .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;

这样会更好吗?我现在没有机会测试它。

编辑。上面的 Push() 解决方案很有效。考虑关闭。

【问题讨论】:

  • 如果您担心丢失数据,请投资备份。
  • 来自perldoc -f open,以下文本:` 如果 MODE 为 >>,则打开文件进行追加,如有必要,将再次创建。`

标签: perl csv


【解决方案1】:

使用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,使用 \n 作为 EOL 字符,逗号作为字段分隔符(这是默认设置),并在包含逗号的字段周围加上引号:

foo,bar,"foo,bar"

【讨论】:

    猜你喜欢
    • 2018-05-16
    • 2018-05-24
    • 2017-07-28
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2019-10-19
    相关资源
    最近更新 更多