$ perl makedata.pl
Failed to parse line: "1","ねこさん"
at /usr/local/share/perl/5.10.0/Class/CSV.pm line 232
Class::CSV::Line::_do_parse('Class::CSV::Line=HASH(0x900eac8)', '"1","\x{e3}\x{81}\x{ad}\x{e3}\x{81}\x{93}\x{e3}\x{81}\x{95}\x{e3}\x{82}\x{93}"') called at /usr/local/share/perl/5.10.0/Class/CSV.pm line 182
Class::CSV::Line::new('Class::CSV::Line', 'fields', 'ARRAY(0x8e0c880)', 'csv_xs_options', 'Class::CSV::CSV_XS_Options=HASH(0x900e128)', 'line', '"1","\x{e3}\x{81}\x{ad}\x{e3}\x{81}\x{93}\x{e3}\x{81}\x{95}\x{e3}\x{82}\x{93}"') called at /usr/local/share/perl/5.10.0/Class/CSV.pm line 390
Class::CSV::new_line('Class::CSV=HASH(0x8e25800)', undef, 'HASH(0x8e25810)') called at /usr/local/share/perl/5.10.0/Class/CSV.pm line 358
Class::CSV::_do_parse('Class::CSV=HASH(0x8e25800)', 'fields', 'ARRAY(0x8e0c880)', 'filename', 'test.csv', 'line_separator', '\x{a}') called at /usr/local/share/perl/5.10.0/Class/CSV.pm line 316
Class::CSV::parse('Class::CSV', 'filename', 'test.csv', 'fields', 'ARRAY(0x8e0c880)', 'line_separator', '\x{a}') called at makedata.pl line 17
プログラムは、
use Class::CSV;
my $csv = Class::CSV->parse(
filename => 'test.csv',
fields => [qw/id name/],
line_separator => "\n",
);
で、データは
"1","ねこさん"
"2","いぬさん"
たったこれだけなのに。。
(実際はコメントいれたりしてるので、エラーの行数はてけと)
とりあえず、Text::CSV::Simple ためそう(ぉぃ
えええええええええええ
$ perl makedata.pl
Failed on "1","ねこさん"
Failed on "2","いぬさん"
えーと、みなさん、何を使われてるんでしょうか。。
Text::CSV_XS がいいとか、ちらっと見えたので、
やってみます。
encode が指定できるみたいなので、期待あげ。
use strict;
use Text::CSV::Encoded;
my $csv = Text::CSV::Encoded->new ({
encoding_in => "utf-8",
encoding_out => "utf-8",
});
while (my $row = $csv->getline (*ARGV)) {
my @fields = @$row;
print $fields[0];
print ": ";
print $fields[1];
print "\n";
}
$ perl makedata.pl test.csv
Wide character in print at makedata.pl line 15, <> line 1.
1: ねこさん
Wide character in print at makedata.pl line 15, <> line 2.
2: いぬさん
エラーが出てますが、utf8 フラグがらみっぽいので、どうにでもなりそうですね!
これで安心して、csv ファイルをふがふができそうです。
一安心。
use Text::CSV_PP;
my $csvfile = "hogehoge.csv"
my $csv = Text::CSV_PP->new( { binary => 1 } );
open( FN, $csvfile ) or die "can not read $csvfile";
while (<FN>) {
my $status = $csv->parse($_);
if ($status) {
my @data = $csv->fields();
} else {
# Error?
print STDERR "status: $statusn";
}
}
close(FN);
こんな感じ?
マルチバイト処理するときは、binary 指定しないとだめなのですねorz
最近は、あんまり意識しないでその辺できてたので目からうろこですが、perlさんよ、そのくらい対応しといてくれよ、と思ったりします…。

