2017-02-08 5 views
-1

my @rowsは、次のデータがあります。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"); 
} 

それが生成するファイル:私はText::CSV.をCSVにエクスポートしようとしている

[ 
      [ 
      '', 
      '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 
      ] 
] 

を私は基本的にドキュメントのページからリッピングされ、このコードを持っています1行のすべてのデータでこのように見えます:

,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 

私はドキュメントを見てきましたが、行を改行で区切る明白な方法を見てください。私は何かを欠いているに違いない。

答えて

4

あなたが明示的にText::CSV->neweol optionを使用してレコードの区切りを設定する必要があります。

EOL

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

「印刷」の行に追加する行末文字列をか「getline」のレコード区切り文字。生成インスタンスに渡されていない場合には、あなたが期待する何かを渡すために、おそらく賢明ですので

[...]

、レコードは、全く終了しません。出力のeolの安全な選択は、$/または\r\nです。

+0

"" \ r \ n "'は安全な選択ではありません。 Perlはデフォルトで ':crlf' PerlIO層をWindowsシステムのSTDINとSTDOUTに適用します。これは、すべての '\ n'を出力時に' \ r \ n 'に変換するので、 '\ r \ n'を送ると、ファイルのすべての行の終わりに' \ r \ r \ n'となります。あなたは 'STDOUT'をbinmodeしてから' eol'に '\ r \ n'を使うことができますが、なぜあなたはそれが見えません。 '$ /'はWindowsとLinuxの両方でデフォルトでは\ n "'です。どこでもデフォルトになるかもしれませんが、VMSやEBCDICシステムのようなプラットフォームについてはわかりません。 – Borodin

+0

@Borodin良いキャッチ、私はなぜH.Merijnブランドがドキュメントにそれを追加したのか分かりません。私は[チケット](https://rt.cpan.org/Ticket/Display.html?id=120145)を提出しました(Text :: CSVドキュメントはText :: CSV_XSドキュメントの恥知らずのコピーですので、ソースから始まるm)。 – ThisSuitIsBlackNot

+0

「Text :: CSV」がコアモジュールであるということは私には起こりませんでした。よくやった。 – Borodin

3

の3つのオプション:

  1. $csv->say($fh, $row)$csv->print($fh, $row)を交換してください。
  2. eol => "\n"をコンストラクタに渡します。
  3. print($fh "\n");にフォローアップしてください。
+0

ああ、私は 'say'について忘れてしまった!これはText :: CSV_PXに追加されたのは、Text :: CSV_PXの1.91リリースの2017-01-28です。これは、Text :: CSV_XSに数年間続きました。 – ThisSuitIsBlackNot

関連する問題