2017-02-08 2 views
-1

my @rows имеет следующие данные:Как я могу выделить строки с новой строкой при экспорте в CSV с помощью Text :: 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 
      ] 
] 

Я пытаюсь экспортировать в CSV с Text::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 

Я просмотрел документацию, но не см. любой очевидный способ разделения строк на новую строку. Я должен что-то упустить.

ответ

4

Вы должны явно установить разделитель с помощью eol option для Text::CSV->new в:

EOL

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

Конец-линии строки, чтобы добавить строки для "печати" или разделитель записей для «getline».

[...]

Когда не прошел в порождающей, например, записи не прекращаются вовсе, так что, вероятно, целесообразно передать то, что вы ожидаете. Безопасный выбор для eol на выходе - $/ или \r\n.

+0

'' \ r \ n "' is * not * безопасный выбор. Perl применяет уровень PerlIO ': crlf' к STDIN и STDOUT в системах Windows по умолчанию. Это преобразует каждый '\ n' в' \ r \ n' на выходе, поэтому отправка '\ r \ n' приведет к' \ r \ r \ n' в конце каждой строки файла. Вы можете «binmode STDOUT», а затем использовать '\ r \ n' для' eol', но я не понимаю, почему вы это сделали. '$ /' is '" \ n "" по умолчанию как для Windows, так и для Linux. Это может быть по умолчанию повсеместно, но я не уверен в таких платформах, как системы VMS или EBCDIC. – Borodin

+0

@Borodin Хорошая добыча, я не уверен, почему H.Merijn Brand добавил это в документы. Я отправил [билет] (https://rt.cpan.org/Ticket/Display.html?id=120145) (документы Text :: CSV - это просто бесстыдная копия документов Text :: CSV_XS, м, начиная с источника). – ThisSuitIsBlackNot

+0

Мне не пришло в голову, что «Text :: CSV» является основным модулем. Отлично сработано. – Borodin

3

Три варианта:

  1. Replace $csv->print($fh, $row) с $csv->say($fh, $row).
  2. Провод eol => "\n" конструктору.
  3. Последующие действия print($fh "\n");.
+0

Арг, я забыл про 'say'! Он был добавлен только в Text :: CSV_PP в версии 1.91 2017-01-28, хотя он был в Text :: CSV_XS в течение нескольких лет. – ThisSuitIsBlackNot

 Смежные вопросы

  • Нет связанных вопросов^_^