- ベストアンサー
データファイル中のデータをランダムに整列させる方法
- データファイル中のデータをランダムに整列させるプログラムの作成方法について教えてください。
- データファイル中のデータを縦に整列させるプログラムの作成方法を教えてください。
- データファイル中のデータをランダムな順序で整列させるためのコードを作成しましたが、うまく動作しません。何かアドバイスをいただけますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
先の方の補足要求で指摘されているとおり,いささか情報不足だと思います. 各数値の求め方(ランダムな値なら定義域)や「こういうデータをこのように変換したい」というような具体例があると,やりたいことが伝わりやすいと思います. とりあえず,質問文からくみ取れた範囲で書いてみたので,試してみてください.$debugの値を1にしておけば簡単な処理の流れがみられます. my $debug = 0; my $filename = "reference.fasta"; my ($tmp_len, $tmp, $out, $x, $y, $rnd_pos); # 読み込み open FILE, "+< $filename" or die "$!"; while(my $line = <FILE>){ # 1行ずつ読み込む chomp $line; # 行末の改行を取り除く $tmp .= $line; # 一次保存用変数に連結する } $tmp_len = length $tmp; print "$tmp_len文字のデータを読み込み\n" if($debug); # XとYの決定 do{ $x = 1 + int rand($tmp_len / 2); }while($tmp_len % $x or $x == 1); $y = $tmp_len / $x; print "$x文字 x $y行 のデータを作成\n" if($debug); # ランダムに並べ替え for(1 .. $y){ $tmp_len = length $tmp; print "[$_] \$tmp:$tmp\n" if($debug); $rnd_pos = int rand($tmp_len - $x); print "\$tmpの$rnd_pos番目から$x文字を\$outに移動して\$outを改行\n" if($debug); $out .= substr($tmp, $rnd_pos, $x, '') . "\n"; } # 保存処理 print "$filenameの中身を消去\n" if($debug); seek FILE, 0, 0; truncate FILE, 0; print "$filenameに\$outを書き込み\n" if($debug); print FILE $out; close FILE;
その他の回答 (1)
- jjon-com
- ベストアンサー率61% (1599/2592)
何がしたいのか分かりません。横70文字×縦100行なのになぜコード中に50が登場するのかも分からない。 どんな入力データ例からどんな出力データ例を得たいのか,具体的に提示していただいた方が話が早いでしょう。
補足
説明不足で申し訳ございませんでした。詳しく説明させていただきます。 下のようなデータがあるとします。 sajisawoeaiugaiguaigauiarajbumzsizmnljgaiuga jiruaijiqoaueouvcmbvfucjafyrtowjfaoggaygaoru ・ ・ まずこのデータの改行を取り除き、一列の文字列にし、その文字列から部分文字列を取得するというプログラムを作成したいです。どこからどこまでの部分文字列を何個取得するかはランダム関数で取得し、実行結果はたとえば、 sawoeaiugaigua jiruaijiqoaueouvcmbvfucjafy jafyrtowjfaoggaygaoru mnljgaiugajiruaij というように部分的に複数の文字列がだぶってもいいとします。 ややこしい説明で申し訳ございませんが、よろしくお願いいたします。
お礼
__awa__さんのプログラムを参考にさせてもらって希望のプログラムを完成することができました。ありがとうございました。またよろしくおねがいいたします。
補足
質問が詳細ではなかったようで、申し訳ございませんでした。詳しく説明させていただきます。たとえば、以下のようなデータがあったとします。 sajiuajirewqwecemncslougaisduiduexksoukuokgzaaaiuagaiuagaf djaidaifuaiduiaduaiguaoguaouaduaiduaiguaioduaiufgdaiufaiof ・ ・ まずこのデータの改行を取って、この並びの順を変えずにランダムに このデータの一部だけをとって、元のファイルに上書きするというプログラムです。プログラム実行例は、 sajiuajirewqwece qwecemncslougaisduidue oduaiufgdaiufaiof iaduaiguaoguaou djaidaifuaiduiaduaiguaoguaouaduaidua といったように、取得する文字数もランダムで、取得する文字列の 行数もランダムにしたいと考えています。取得する文字列はランダムに取得するのではなく、元の並びの順番は変えずに、ある部分だけを取得します。説明がややこしくて、わかりづらくて申し訳ございませんが、よろしくお願いいたします。またわかりにくければ、言ってください。