• ベストアンサー

ソート処理

ついこの間正規表現のことで質問させていただいたものです なんとか問題は解決しました それとは別にソート関連での質問があります 正規表現の前にソートについて質問してご回答を頂いてからそれを参考に試してみました http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 です push で@tmpの内容を ($score,$filename,$title,$sentenceの順番に) 3.5 abc.txt あいうえお aaaaa 4.6 def.txt かきくけこ bbbbb 2.8 ghi.txt さしすせそ ccccc 5.1 jkl.txt たちつてと ddddd という風にしました このリストを @tmp = map {$_->[0]} sort {$a->[0] <=> $b->[0]} map {[$_, split /<>/]}@tmp; としたんですが結果は abc.txt あいうえお aaaaa def.txt かきくけこ bbbbb ghi.txt さしすせそ ccccc jkl.txt たちつてと ddddd 3.5 4.6 2.8 5.1 というふうになってしまいます これを スコア順に 5.1 jkl.txt たちつてと ddddd 4.6 def.txt かきくけこ bbbbb 3.5 abc.txt あいうえお aaaaa 2.8 ghi.txt さしすせそ ccccc としたいのですがうえのソースでは何がいけないんでしょうか??

  • Perl
  • 回答数8
  • ありがとう数2

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

  • ベストアンサー
  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.3

以下のスクリプトが私が試した内容です。比較してみて下さい。 my @tmp; while (<DATA>) { push @tmp, $_; } @tmp = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /<>/]}@tmp; print @tmp; __END__ 3.5<>abc.txt<>あいうえお<>aaaaa 4.6<>def.txt<>かきくけこ<>bbbbb 2.8<>ghi.txt<>さしすせそ<>ccccc 5.1<>jkl.txt<>たちつてと<>ddddd

その他の回答 (7)

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

ソート処理のコードには間違いがないのですから、その入力@tmpを疑うべきではないでしょうか。@tmpがどうなっているか単純にprint '@tmp: ', "\n@tmp\n";みたいなのを入れてみてチェックしてみたら解決につながると思います。 # 別の処理をしてからこのソート処理をするのであれば、別の処理はソート処理の入力に相応しい形式で出力させる必要があります # ソート処理後に別の処理で変更されている可能性もあります # No.1の説明で理解できないのであれば、No.6の方のようなコードの方が理解した上で改変できていいのではないでしょうか No.6の方のやり方はハッシュを使っていますが、そのキーとして数値を使うのは問題だと思います (数値は異なるレコードで重複する場合があり得ると思うので)。もしこのように数値を@scoreとして取り出しているのであれば、%all_hなどは必要なく単純に for(sort {$score[$b] <=> $score[$a]} 0..$#score) { print $data[$_]; # @dataと@tmpは同じもの } のようにすればいいのではないでしょうか。つまり、No.3と同様のコードを示すと、 my @tmp; my @score; while (<DATA>) { push @tmp, $_; push @score, (split /<>/)[0]; } for (sort {$score[$b] <=> $score[$a]} 0..$#score) { print $tmp[$_]; } __END__ 3.5<>abc.txt<>あいうえお<>aaaaa 4.6<>def.txt<>かきくけこ<>bbbbb 2.8<>ghi.txt<>さしすせそ<>ccccc 5.1<>jkl.txt<>たちつてと<>ddddd

gonntetu
質問者

お礼

ご回答してくださった方々ありがとうございました 完全に問題が解決したわけではありませんが ソートだけのスクリプトだけを作成し実行したら上手く動作したので あとはこれを応用して問題を解決したいと思います 本当にありがとうございました

回答No.7

既に No.3 で答えは出ています。 あなたの質問に書いた処理と No.3 の処理は違います。(sortの対象が違います)。 よく読んで下さい。

gonntetu
質問者

補足

0と1がちがうんですよね?? sort をインデックス 1 に書き換えました ソート処理だけのスクリプトを作成し実行させるとうまくいきました しかしこれを別のスクリプトと組み合わせて使うと一行目にまとまってしまいます {$b->[1] <=> $a->[1]} とすると一行目にスコアがまとまり {$a->[1] <=> $b->[1]} とすると最後の行にまとまってしまいます

  • SE-1
  • ベストアンサー率57% (26/45)
回答No.6

素人考えですが、こんなんどうでしょう。ご希望の結果にはなると思います。 @data=qw/3.5,abc.txt,あいうえお,aaaaa 4.6,def.txt,かきくけこ,bbbbb 2.8,ghi.txt,さしすせそ,ccccc 5.1,jkl.txt,たちつてと,ddddd/; foreach(@data){ /^([\d|.]+?),/mg; push @score,$1; } $score_n = @score; for ($i=0;$i<$score_n;$i++){ $all_h{$score[$i]}=$data[$i]; } for(sort { $b <=> $a } keys %all_h){ print "$all_h{$_}\n"; } ちなみにリファレンスと無名配列による多次元配列は以下のサイトがわかりやすいかと。

参考URL:
http://takenaka-akio.cool.ne.jp/doc/perl_kiso/reference3.html
  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.5

No.3のスクリプトを動かしてみましたか? その結果と比べてみてどうでしょう?

gonntetu
質問者

補足

実はNo.3のコードと同じ処理をしています foreachでまわしてpushしていますので違いは無いかと思います 起用にスコアの値だけを一行目に集めてさらにスコアだけをソートしちゃってます^^;;; ちなみに自分にはそんな難しい処理をすることは出来ません

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.4

・・・もしかして @tmp の中身、 my @tmp = ( 3.5, "abc.txt", "あいうえお", "aaaaa\n", 4.6, "def.txt", "かきくけこ", "bbbbb\n", 2.8, "ghi.txt", "さしすせそ", "ccccc\n", 5.1, "jkl.txt", "たちつてと", "ddddd\n", ); みたいになってたりしませんか? #そうだったにしても1行目の 3.5 4.6 2.8 5.1 は謎ですが。

gonntetu
質問者

補足

なっていません <>でくぎってます なぞの一行目の数値はしっかりソートされています この問題は解決できないんでしょうか??

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.2

No.1です。先ほどのお話は 3.5 abc.txt あいうえお aaaaa は 3.5<>abc.txt<>あいうえお<>aaaaa の打ち間違えで、 $tmp[0] が 3.5<>abc.txt<>あいうえお<>aaaaa であると仮定しています。

gonntetu
質問者

補足

0を1に変えてためしてみたところ 3.5 4.6 2.8 5.1 5.1 4.6 3.5 2.8 abc.txt あいうえお aaaaa def.txt かきくけこ bbbbb ghi.txt さしすせそ ccccc jkl.txt たちつてと ddddd のような感じになってしまいました 結構多くのサイトを見てみたんですけどどこも教えていただいたソースコードでちゃんと出来ているみたいです となると何がいけないんでしょうか??普通にソースコードを書いてアップロードしてるだけなのですが…

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.1

@tmp = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /<>/]}@tmp; です。 [$_, split /<>/] で、無名配列に 0 のところに 3.5 abc.txt あいうえお aaaaa 1 のところに 3.5 2 のところに abc.txt 3 のところに あいうえお 4 のところに aaaaa が入ります。 ですから sort はインデックス 1 の部分を使います。 それと昇順降順が逆ですので、 {$b->[1] <=> $a->[1]} となります。

関連するQ&A

  • グーグルドキュメント(文書)で2列にする方法

    グーグルドキュメント(文書)で2列にしたいです。 横書きの場合。 左半分で、左上から始まり下にまでいく。 右半分の上にから始まり下までいくと、次のページ・・・ イメージだとこんなかんじです。 1枚目 aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb aaaaa bbbbb 2枚目 ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd ccccc  ddddd

  • シュワルツ変換の不具合

    シュワルツ変換の不具合で困っています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1959574 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 で質問したものです。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; &hoge; sub hoge{ open(o,"hoge.txt"); @all = <o>; close(o); for (@all){ ($sentence,$filename) = split(/,/,$_); $score++; push @hoge, ($score,$_,"<br>\n"); } @hoge = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /,/]}@hoge; print @hoge; } というcgiを作成し、実行してみたのですが望んだ処理が出来ません。 hoge.txtは ,123,abc.txt ,456,def.txt ,789,ghi.txt ,123,jkl.txt ,456,mno.txt ,789,pqr.txt という内容です。 cgiを実行すると 6 5 4 3 2 1 ,789,pqr.txt ,456,mno.txt ,123,jkl.txt ,789,ghi.txt ,456,def.txt ,123,abc.txt となってしまいスコアが先頭に集まってしまいます。 シュワルツ変換の行を削除すると 6,789,pqr.txt 5,456,mno.txt 4,123,jkl.txt 3,789,ghi.txt 2,456,def.txt 1,123,abc.txt こうなるのですが、これをシュワルツ変換を用いて 1,123,abc.txt 2,456,def.txt 3,789,ghi.txt 4,123,jkl.txt 5,456,mno.txt 6,789,pqr.txt と出力させたいのです。 どこをどのように変えればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 連想配列を変数にする?

    こんにちは。 質問タイトルが変かもしれません。。。 xmlから受け取ったデータをphpで表示してます。 ・・・xmlデータの受取(?)は他社にお願いしており、私はphpでの表示のみなのでデータそのものは分かりません。 [aaaaa][bbbbb][ccccc][ddddd][depday] [aaaaa][bbbbb][ccccc][ddddd][cityname] [aaaaa][bbbbb][ccccc][ddddd][b][depday] [aaaaa][bbbbb][ccccc][ddddd][b][cityname] のように非常に長い連想配列があり、一番最後の[depday]と[cityname]は常に同じです。あまりにも長いので $hairetsu_1 = [aaaaa][bbbbb][ccccc][ddddd]; echo $hairetsu_1[depday]; echo $hairetsu_1[cityname]; $hairetsu_2 = [aaaaa][bbbbb][ccccc][ddddd][b]; echo $hairetsu_2[depday]; echo $hairetsu_2[cityname]; のように表示させる事は出来るのでしょうか? とんちんかんな質問だったらお許しください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • wordの段落を保持したままテキスト変換

    wordで作成した文書を、段落の見た目を保持したままテキストに変換する方法はないでしょうか? 段落がスペースに変換されるといいのですが、 コピー&ペーストですと行頭がそろってしまいます。 やりたいこと word文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd ↓ テキスト文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd コピー&ペーストの場合 word文書 1.aaaaa  (1)bbbbb   ア.ccccc   イ.ddddd  (2)ddddd   ア.ccccc   イ.ddddd ↓ テキスト文書 1.aaaaa (1)bbbbb ア.ccccc イ.ddddd (2)ddddd ア.ccccc イ.ddddd よろしくお願いいたします。

  • 秀丸のマクロでカラムごとの処理

    aaaaa,bbbbb,ccccc,ddddd,eeeee 上記のようなCSVファイルで、2カラム目のbbbbbと 4カラム目のdddddの文字を変換するという場合 どういったマクロになりますでしょうか? よろしくお願いします。

  • グループ化+最大値

    お世話になっております。GomiYasikiです。 以下のような場合で、フィールドAが同じ中のフィールドBが最大値のものを抽出する場合はどのようにすればよいのでしょうか? お手数ですが、宜しくお願い致します。 テーブル名:テーブルA フィールドA,フィールドB,フィールドC AAAAA,1,ABC AAAAA,2,XYZ BBBBB,1,ABC BBBBB,2,DEF CCCCC,1,AAA ↓結果 AAAAA,2,XYZ BBBBB,2,DEF CCCCC,1,AAA

  • ExcelVBAでテキスト出力で最後の行に追記

    エクセルVBAで、すでに色々と書き込まれているテキストファイルがあり 一番最後の行に追記したいです。 具体的に下記のようなテキストにzzzzzzと追記して aaaaa bbbbb ccccc ddddd 下記のようにしたいです。 どのようにしたらよいのでしょうか? aaaaa bbbbb ccccc ddddd zzzzzz

  • dosでサイズを比較して異なるファイルだけコピー

    dosで全フォルダ内のファイルサイズを比較して異なるファイルだけコピーしたい 次のようなファイル構成で AAAフィルダ    BBBフォルダ  cccフォルダ    cccフォルダ   abc.txt      abc.txt   def.jpg      def.jpg  dddフォルダ    dddフォルダ   ghi.txt      ghi.txt   jkl.jpg      jkl.jpg AAA\ccc\abc.txtとBBB\ccc\abc.txt AAA\ccc\def.jpgとBBB\ccc\def.jpg AAA\ddd\ghi.txtとBBB\ddd\ghi.txt AAA\ddd\jkl.jpgとBBB\ddd\jkl.jpg 拡張子は問わずそれぞれに対するファイルのファイルサイズを比較して 大きくても小さくても異なるファイルだけbbbフォルダ内に上書きコピー したくご教授をお願いします

  • 秀丸の検索・置換の正規表現の最短一致の挙動が変です

    秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz の先頭にカーソルを置いた状態で、 (質問1) 正規表現のチェックボックスをチェックして /.*$ で検索すると /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (/abc/.*$とするとカーソルがある /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz ではなく次の行以降の /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます?) (質問2) 正規表現のチェックボックスをチェックして /.*?$ で検索すると最短一致となるため /uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (なお、/[^/]*$では/uvw.xyzが検索されます)

  • 複数種類の括弧でくくられてない文字をマッチングさせたい

    Perlの正規表現で質問です。 複数種類の括弧、たとえば()、【】、[]などで囲まれていない文字をマッチングさせたいのです。 括弧は1行に複数ある可能性があり、ない場合もあります。 (abc)【def】ghi【jkl】 だとghiの部分。 【abc】【def】(ghi)jkl(mno) だとjklです。 頭に必ず括弧が来たり、括弧が一回だけなら括弧閉じるの種類をor検索ではじけるのですが、何回くるかわからないのでどうしたらいいか困っています。 方法がありましたら教えてください。

    • ベストアンサー
    • Perl