web-dev-qa-db-ja.com

Perlを使用してCSVファイルを作成するにはどうすればよいですか?

Perlを使用してCSVファイルを作成し、それにデータを書き込みたいのですが。それを行う方法はありますか?

23
tom

Class: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 を検索できます。

26
lutz

通常 Text::CSV_XS (上記の Class::CSV はに基づいています)

UPDATE:以下のコメンターも Text::CSV ロードされます Text::CSV_XS または、それが利用できない場合は、フォールバック Text::CSV_PPXS依存関係がなく、インストールが簡単な場合があります。

18
DVK

それを行う方法は複数あります。

  • DBD :: CSV -CSVファイルの読み取りと書き込みにSQLを使用します。
  • Text :: CSV -CSVファイルを一度に1行ずつ作成して解析します。これは、CSV操作のゴールドスタンダードです。
  • POE :: Filter :: CSV -POEコンポーネントIOにCSVフィルターを提供します。
  • 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";
}

スクリプトを実行して、出力をファイルにリダイレクトするだけです。完了です。または、クレイジーになって open ファイルハンドルを取得し、ファイルに直接出力することもできます。

ただし、この場合、複数行のフィールド、埋め込まれたコンマ、またはこの種のデータ処理タスクで発生する可能性のある他の多くの奇妙な要素は処理しません。したがって、このアプローチには注意してください。

私のおすすめ:

  • POEアプリケーションを構築する場合は、POE :: Filterを使用します。
  • SQL/DBIモンスターであり、SQLの夢である場合、またはCSV出力を実際のデータベース接続に置き換える必要がある場合は、DBD :: SQLを使用してください。
  • 単純なデータがあり、ぎこちない使い捨てのスクリプトをまとめて、スプレッドシートがダイジェストするように一部のデータをフォーマットする場合は、printとjoinを使用します。これは、2時間を超える予想寿命を持つコードがない場合に実行します。
  • データのblobをCSVまたはXMLにダンプする場合は、Data :: Tabular :: Dumper :: CSVを使用します。
  • 安定性、保守性、高速性が必要なものを記述していて、入力と出力を最大限に制御する必要がある場合は、Text :: CSVを使用します。 (POE :: Filter :: CSV、Data :: Tabular :: Dumper :: CSV、およびDBD :: CSVはすべて、バックエンド処理としてText :: CSVまたはText :: CSV_XSを使用することに注意してください)。
13
daotoad