【Perl】Text-CSV_XS の使い方を教えてください。


use utf8;
use Text-CSV_XS;
my @columns = qw/ id name age ken city /;
my $text = <<'_E';
"02547","佐藤大輔","25","北海道","苫小牧市"
"15983","田中久志","19","沖縄県","那覇市"
"00893","本間雅洋","29","神奈川県","横浜市"
_E

# $text から下記の配列を生成するにはどうすれば良いのでしょうか?
#
@array = (
{
id => '02547',
name => '佐藤大輔',
...
},
{
id => '15983',
name => '田中久志',
...
}, ... );

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/06/07 21:09:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:shintabo No.1

回答回数45ベストアンサー獲得回数10

ポイント60pt

#!/usr/bin/perl

use strict;

use warnings;

use Text::CSV_XS; # or Text::CSV;

my @columns = qw/ id name age ken city /;

my $text = << '_E';

"02547","佐藤大輔","25","北海道","苫小牧市"

"15983","田中久志","19","沖縄県","那覇市"

"00893","本間雅洋","29","神奈川県","横浜市"

_E

my $csv = Text::CSV_XS->new({binary => 1});

$csv->combine(@columns);

my(@ret, @f, $hr, @col);

for (split(/\n/, $text)) {

$csv->parse($_);

@col = $csv->fields;

for (@columns) {

$hr->{$_} = shift @col;

}

push(@ret, $hr);

}

# print する

for my $r (@ret) {

for (keys %$r) {

print "$_ = $r->{$_}\n";

}

}

__END__

# ファイルの場合は

open(my $io, "./a.csv");

$csv->column_names(@columns);

my $hr = $csv->getline_hr($io);

for (keys %$hr) {

print "$_ = $hr->{$_}\n";

}

close($io);

# これでOK

id:radio3

shintaboさん、ありがとうございます!

ばっちり動きました。

結構べた書きする必要があるんですね。

$csv->new( column_names => \@columns );

$csv->parse($text);

print YAML::Dump( $csv->to_hash );

みたいな感覚で実現できるのでは?

などと見込んでおりました。

誰も回答してくれないので、そう簡単にはいかなさそう...

と、ちょっとがっかりしてたところです。

ご回答本当にありがとうございました。

ファイル入力バージョンまで書いていただき、ありがとうございます!

それにしても

$csv->combine( @columns );

て何してくれてるんでしょうかね... ?

コメントアウトしても結果同じ(成功)でした。

2008/06/07 21:08:06
  • id:shintabo
    $csv->combine( @columns );
    これは、コピペミスです

    cpanには、以下のようにあります
    $status = $csv->combine(@columns); # combine columns into a string
    $line = $csv->string(); # get the combined string
    print $line; # = id,name,age,ken,city となるようです

    なので、今回の質問とは無関係でした

    失礼いたしました m(_ _)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません