• ベストアンサー

csvで順番の入れ替え

perlでのCSVデータの並べ替えで質問があります。 0001 東京都 0002 千葉県 0003 埼玉県 0004 栃木県 という順番で保存されているcsvファイルの順番を 0001 東京都 0004 栃木県 0002 千葉県 0003 埼玉県 というように替える方法が知りたいのです。 ご存じの方がいらしたらよろしくお願いします。

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

  • ベストアンサー
  • kapura
  • ベストアンサー率50% (48/95)
回答No.3

既に回答されている通り、並び替えの規則を明確にしてソートするだけだと思います。 基本的に整数番号を数値として扱って小さい順に並べるとして、栃木県を特別扱いするとすれば、栃木県の数値を適当な小数に置き換えてソートすればいいのではないでしょうか。下のコードは適切な書き方なのか自信ないですが、参考になれば。 my @indx = ('0003', '0001', '0004', '0002'); my @pref = ('埼玉県', '東京都', '栃木県', '千葉県'); my @sorted = sort sort_tochigi 0..$#pref; for (@sorted) { print $indx[$_], ': ', $pref[$_], "\n" } sub sort_tochigi { my $cmp = ($pref[$a] eq '栃木県' ? 1.5 : $indx[$a]) <=> ($pref[$b] eq '栃木県' ? 1.5 : $indx[$b]); return $cmp; }

kaepuri
質問者

お礼

書き方がまずかったと反省してますが、基本的には指定されたCSVデータを一行上に移動(入れ替え)したり、一行下に移動したりという事がしたかったのです。 ご回答くださったコードの方も参考にさせていただきます。 ありがとうございます。

その他の回答 (2)

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

そもそも「どのようなデータ構造を使っていて」「どのような順番にしたいのか」がわからないと答えようもないだけど, 例えば @data: データの配列 @order: $i 番目に出力したいデータは $data[$order[$i]] となっていれば print @data[@order]; でもいいかもしれない. あとは, 例えば for my $key (@item) { print $data{$key}; } みたいにハッシュと for を組合せるとか.

kaepuri
質問者

お礼

うーん、なるほど、参考になりそうです。 ありがとうございます。

noname#39970
noname#39970
回答No.1

並び替えの規則が書かれていない。 読み方順で並び替えたいのであれば読み仮名を追加しなければならない(漢字は複数の読みが存在するから) あるいは都道府県による読み仮名辞書(のデータベース)を別途用意する必要がある。

kaepuri
質問者

お礼

法則はないです。 表記のように東京都・千葉・埼玉・栃木の順に保存されていて、ある理由により東京の次に栃木がくるようにしたい、とか、今回は東京を一番下にしたい、とかそのように使いたいのです。 ソートではないので、やり方がわからず困っています。

関連するQ&A