• ベストアンサー

csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません

次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

そもそも sort のブロックでsplitのような重い処理をさせるのはどうかと思います。 #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; use utf8; binmode STDOUT, ':encoding(cp932)'; my @data; while (my $line = <DATA>) { chomp $line; my @f = split q{,}, $line; (my $key = $f[0]) =~ tr/"//d; push @data, [$key, $line]; } my @sorted_data = sort {$a->[0] <=> $b->[0]} @data; say $_->[1] for @sorted_data; __END__ "28000000","鈴木" "27000000","佐藤" "26000000","渡辺" "30000000","鈴木" "28000000","坂本" "900000","村田" わざと冗長に書いたので多少はわかりやすいと思います。 数字の部分は正規表現で取り出す手もありますね。

goonejp
質問者

補足

試してみたいと思います。 ありがどうございました。

その他の回答 (3)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.4

@LINE = map($_->[1], sort{$a->[0] <=> $b->[0]} map{m/([^\"]*)/, [$1, $_]} @LINE); かな。 # テストしてません。

goonejp
質問者

補足

ありがとうございます。 "で分けるわけですね・・・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 で十分だと思うけど別解は eval.

goonejp
質問者

補足

ちょっと良くわかりませんが、何か方法があるのでしょう。 ありがとうございます。

  • smcss
  • ベストアンサー率63% (7/11)
回答No.1

カンマでなくダブルクォートで split すればどうでしょう。 @LINES = sort { (split(/\"/,$a))[1]+0 <=> (split(/\"/,$b))[1]+0 } @LINES; この例だと添え字が [0] ではなく[1]になります。

goonejp
質問者

お礼

ありがとうございます。 なるほどです。