welcome to http://noriko3.blog42.fc2.com/


 CSV parser に 日本語入ってるファイル食わすとエラーに 

なんてこったい。。

$ 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 ファイルをふがふができそうです。


一安心。


2008/12/02 | 15:24
perlコメント:2トラックバック:0
 コメント 
解決済みみたいだけど、わりと一般的なのは下のように binary=>1 を指定する方法かなぁ?

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);

こんな感じ?
2008-12-02 火  16:41:21 |  URL | くに #emPmXgFY [編集]
コードありがとうございます!
マルチバイト処理するときは、binary 指定しないとだめなのですねorz
最近は、あんまり意識しないでその辺できてたので目からうろこですが、perlさんよ、そのくらい対応しといてくれよ、と思ったりします…。
2008-12-04 木  11:00:29 |  URL | 紀子さん #- [編集]
 コメントの投稿 


管理者にだけ表示を許可する

トラックバック

この記事にトラックバッ クする(FC2ブログユーザー)


 


Copyright © 紀子さん@へぼぷろぐらまの日常 All Rights Reserved. Powered By FC2. 
Template Desingned by ちょwwwのけものオンライン?
FC2 Blog Ranking FC2ブログ