- ベストアンサー
csv元データーの数字の列が、""で囲まれているせいか、数値としてのソートできません
次の式でソートしたいのですが、 @LINES = sort { (split(/\,/,$a))[0] <=> (split(/\,/,$b))[0] } @LINES; csv元データーの数字の列が、 "28000000","鈴木", のように""で囲まれているせいか、<=>で数値としてのソートできません。 cmpで文字列としてのソートは出来ます。 どうしたら良いのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
そもそも 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","村田" わざと冗長に書いたので多少はわかりやすいと思います。 数字の部分は正規表現で取り出す手もありますね。
その他の回答 (3)
- zxcv0000
- ベストアンサー率56% (111/196)
@LINE = map($_->[1], sort{$a->[0] <=> $b->[0]} map{m/([^\"]*)/, [$1, $_]} @LINE); かな。 # テストしてません。
補足
ありがとうございます。 "で分けるわけですね・・・
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 で十分だと思うけど別解は eval.
補足
ちょっと良くわかりませんが、何か方法があるのでしょう。 ありがとうございます。
- smcss
- ベストアンサー率63% (7/11)
カンマでなくダブルクォートで split すればどうでしょう。 @LINES = sort { (split(/\"/,$a))[1]+0 <=> (split(/\"/,$b))[1]+0 } @LINES; この例だと添え字が [0] ではなく[1]になります。
お礼
ありがとうございます。 なるほどです。
補足
試してみたいと思います。 ありがどうございました。