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
我查看了文档,但没有看到任何明显的方法用换行符分隔行。我一定错过了什么。
答案 0 :(得分:4)
您需要使用eol
option到Text::CSV->new
:
<强> EOL 强>
my $csv = Text::CSV->new ({ eol => $/ }); $csv->eol (undef); my $eol = $csv->eol;
要添加到“print”行或“getline”的记录分隔符的行尾字符串。
[...]
如果未在生成实例中传递,则记录根本不会终止,因此传递您期望的内容可能是明智之举。输出
eol
的安全选择是$/
或\r\n
。
答案 1 :(得分:3)
三个选项:
$csv->print($fh, $row)
替换为$csv->say($fh, $row)
。eol => "\n"
传递给构造函数。print($fh "\n");
。