使用Text :: CSV导出为CSV时,如何使用换行符分隔行?

时间:2017-02-08 01:41:19

标签: perl

my @rows包含以下数据:

[
          [
            '',
            '2000',
            '2001',
            '2002',
            '2003',
            '2004',
            '2005',
            '2006',
            '2007',
            '2008',
            '2009',
            '2010',
            '2011',
            '2012',
            '2013',
            '2014',
            '2015',
            '2016',
            '2017'
          ],
          [
            'PA',
            1848,
            1851,
            1840,
            1783,
            1598,
            1084,
            1308,
            1170,
            1388,
            1326,
            1397,
            1452,
            1435,
            1425,
            1377,
            1343,
            420,
            30
          ]
]

我正在尝试使用Text::CSV.导出为CSV我的代码基本上是从文档页面中删除的:

sub generate_csv_file {
  my $self = shift;
  my $rows = shift;

  open my $fh, ">:encoding(utf8)", "state_reports.csv" or logf("Can't open CSV file for writing");
  $self->csv->print ($fh, $_) for @$rows;
  close $fh or logf("Can't close CSV file");
}

它生成的文件看起来像这样,所有数据都在一行:

,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017PA,1848,1851,1840,1783,1598,1084,1308,1170,1388,1326,1397,1452,1435,1425,1377,1343,420,30TX,1165,1198,1202,1177,1132,772,928,866,1024,946,982,1067,1068,1050,1038,1011,310,0

我查看了文档,但没有看到任何明显的方法用换行符分隔行。我一定错过了什么。

2 个答案:

答案 0 :(得分:4)

您需要使用eol optionText::CSV->new

明确设置记录分隔符
  

<强> EOL

my $csv = Text::CSV->new ({ eol => $/ });
          $csv->eol (undef);
my $eol = $csv->eol;
     

要添加到“print”行或“getline”的记录分隔符的行尾字符串。

     

[...]

     

如果未在生成实例中传递,则记录根本不会终止,因此传递您期望的内容可能是明智之举。输出eol的安全选择是$/\r\n

答案 1 :(得分:3)

三个选项:

  1. $csv->print($fh, $row)替换为$csv->say($fh, $row)
  2. eol => "\n"传递给构造函数。
  3. 跟进print($fh "\n");