Как создать файл CSV с помощью Perl? - PullRequest
22 голосов
/ 18 сентября 2009

Я хочу создать файл CSV с использованием Perl и записать в него некоторые данные. Есть ли способ сделать это?

Ответы [ 3 ]

25 голосов
/ 18 сентября 2009

Вы можете использовать Класс: CSV .

use Class::CSV;

my $csv = Class::CSV->new(
  fields         => [qw/userid username/]
);

$csv->add_line([2063, 'testuser']);
$csv->add_line({
  userid   => 2064,
  username => 'testuser2'
});

$csv->print();

# 2063,testuser
# 2064,testuser2

Редактировать : Для большего количества библиотек вы можете искать CPAN .

18 голосов
/ 18 сентября 2009

Обычно мы используем Text::CSV_XS (на котором основано вышеупомянутое Class::CSV)

ОБНОВЛЕНИЕ: Комментаторы ниже также предлагают использовать Text::CSV, который загрузит Text::CSV_XS или, если это не доступно, отступить на Text::CSV_PP, которая не имеет зависимости XS и может быть проще в установке.

12 голосов
/ 19 сентября 2009

Существует более одного способа сделать это.

  • DBD :: CSV - Используйте SQL для чтения и записи файлов CSV.
  • Text :: CSV - Построить и проанализировать CSV-файлы по одной строке за раз. Это в значительной степени золотой стандарт для манипулирования CSV.
  • POE :: Filter :: CSV - Предоставляет CSV-фильтр для ввода / вывода вашего POE.
  • Data :: Tabular :: Dumper :: CSV - Дамп таблицы непосредственно в файл CSV (объекты с одинаковым интерфейсом могут выполнять дамп в файлы XML или MS Excel).

На CPAN также есть много других

Конечно, вы можете игнорировать все это и просто использовать цикл, объединение и печать:

my @table = (
  [ 'a', 'b', 'c'],
  [  1,   2,   3 ],
  [  2,   4,   6 ],
);

for my $row ( @table ) {
    print join( ',', @$row ), "\n";
}

Просто запустите ваш скрипт и перенаправьте вывод в файл, взрыв! вы сделали. Или вы можете сойти с ума и открыть дескриптор файла и распечатать непосредственно в файл.

Но тогда вы не будете обрабатывать многострочные поля, или встроенные запятые, или любые другие странности, которые могут возникнуть в такой задаче обработки данных. Так что будьте осторожны с этим подходом.

Мои рекомендации:

  • Если вы строите POE приложение, используйте POE :: Filter.
  • Если вы монстр SQL / DBI и мечтаете SQL, или может потребоваться заменить CSV вывод с реальной базой данных соединение, используйте DBD :: SQL.
  • Если у вас есть простые данные и катаются вместе грубый маленький сценарий отформатировать некоторые данные для вашей таблицы чтобы переварить, использовать print и join - делайте это без кода с ожидаемой продолжительностью жизни более 2 часов.
  • Если вы хотите, чтобы сбросить блок данных в Использование CSV или XML Данные :: Табличный :: Dumper :: CSV.
  • Если вы пишете что-то, что должно быть стабильным, обслуживаемым и быстрым, и вам нужен максимальный контроль для ввода и вывода, используйте Text :: CSV. (Обратите внимание, что POE :: Filter :: CSV, Data :: Tabular :: Dumper :: CSV и DBD :: CSV все используют Text :: CSV или Text :: CSV_XS для внутренней обработки).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...