• 締切済み

インデックス(index)関数を用いて

ある数値配列をもったファイルがあります。(100個ほど数値があるとしてください)その中から、自分でプログラムを作る際に指定した連続した配列(7、8個程度だと考えてくだされば結構です)を探し、それが見つかった場所から配列の最後までを表示するプログラムを作りたいんですが、どのようにしたらいいんでしょうか? インデックスindexだけでは、指定した文字が存在するかしないかの判断はできると思われるんですが。 実行する際には、以下のようにするつもりです。 プログラムファイル名.pl データファイル(数値配列)名.txt 検索する数値列(ここでは簡単に表示するために1234567)としておきます。 わかりにくくてすいませんが、回答よろしくお願いします。

noname#184617
noname#184617
  • Perl
  • 回答数4
  • ありがとう数2

みんなの回答

  • urakids
  • ベストアンサー率77% (7/9)
回答No.4

第一引数を下記で受け取ると @data=<>; 第二引数が受け取れないと思いますよ。 一応、内容に沿っているのでは?と思えるように 書き換えましたが、chaimasukaさんの回答の方が すっきりしていて良いかもしれませんね。 #!/usr/bin/perl -w use strict; my(@DATA, $out); #引数チェック if ($#ARGV < 1) { print qq(引数が足りない。\n); print qq(perl $0 data.txt search_num\n); exit(1); } #ファイルオープン open(FILE, "$ARGV[0]") or die("$ARGV[0]が開けない"); eval{flock(FILE,1);}; @DATA = <FILE>; close(FILE); #配列内チェック foreach(@DATA) { my($len, $str); #文字列位置取得 if ($_ =~ /^>/) { next; } $len = index($_, $ARGV[1]); if($len == -1) { #文字列が見つからなかったので次へ next; } #指定位置以降を取得 $str = substr($_, $len); $str =~ tr/\r\n//d; $out .= $str; #print qq($str); } print qq($out);

noname#184617
質問者

お礼

わかりました、ありがとうございます。

回答No.3

index, substr, length にこだわらないのであれば、 正規表現を用いて、以下のようにすっきり書けると思います。 -------------------------------------------------------------------------------- #!/usr/bin/perl use strict; use warnings; use Fatal qw(open close); sub usage { die "Usage: perl <data.txt> <search_num>\n"; } my $filepath = shift or usage(); my $keynumber = shift or usage(); my $flag; open my $fh, '<', $filepath; while ( <$fh> ) { print, next if $flag; $flag = 1, print "$1\n" if /($keynumber.*)$/; } close $fh; --------------------------------------------------------------------------------

noname#184617
質問者

お礼

実行できました。ありがとうございます。

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

すみません, 正直なところ「やりたいこと」が見当つきません. できれば具体的な例で「何をやりたいのか」を書いてもらえませんか?

noname#184617
質問者

補足

>acdeerer kiuj database data sequence 123659856986578569871225989785642358945623213 123654885456523546875448675135487313548313549 123457854678798453735475678454564867834346767 545467542123456876543531346874346754345646434 547895487989865656232154879895651245787565451 123456789012365498745612300001235644788952122 上の内容のファイルがあります。 今回知りたいのは、質問欄にも記載しましたが、自分でプログラムを実行する際に12345678を指定し、それから始まる数値配列をindex関数で探し、そこから最後の数値までを表示させたいと考えているんです。 実行結果としては123456789012365498745612300001235644788952122 (最後の行)だけを表示させたいんです。 index substr length関数を使うのはわかるんですがNo1さんの補足の欄にも記載しましたが、そのプログラムにどのようにindex substr lengthを応用させたらいいんですか?

  • urakids
  • ベストアンサー率77% (7/9)
回答No.1

こういった感じではどうですか? #!/usr/bin/perl -w use strict; my(@DATA); #引数チェック if ($#ARGV < 1) { print qq(引数が足りない。\n); print qq(perl $0 data.txt search_num\n); exit(1); } #ファイルオ^プン open(FILE, "$ARGV[0]") or die("$ARGV[0]が開けない"); eval{flock(FILE,1);}; @DATA = <FILE>; close(FILE); #配列内チェック foreach(@DATA) { my($len, $str); #文字列位置取得 $len = index($_, $ARGV[1]); #指定位置以降を取得 $str = substr($_, $len); print qq($str); } たぶん書かれた内容にあったプログラムだと思いますが・・・。

noname#184617
質問者

補足

以下のプログラムをつくったんですが、これを実行するだけでは実行する際に自分の指定した文字列以降の文字列を表示させることができません。 どこにindex(文字位置の指定) substr(指定した文字列以降の文字を表示させるための条件文) length(文字列長を指定)をいれるとおもうのですが、どのようにするべきでしょうか? #! /usr/bin/perl @data=<>; print "普通の配列\n"; foreach $line(@data) { if($line!~/^>/) { chomp $line; $data.=$line; print "$line"; } } exit;

関連するQ&A

  • match関数とindex関数について

    B列に空白を含む連続した数値の配列において、空欄と空欄の間の数値の個数を数える式として、以下の式を見たことがあります。 =IF(AND(B9<>"",B10=""),IF(ROW(B9)=COUNT($B$1:B9),ROW(B9),ROW(B9)-MATCH(1,INDEX(0/($B$1:B9=""),0))),"") 確かにこの式で求める答えが出るのですが、式の最後の「MATCH(1,INDEX(0/($B$1:B9=""),0)」の意味がよく分かりません。 ・MATCH関数の範囲としているINDEXの内容はどういう意味なのか ・MATCH関数の検査値としている「1」はどういう意味なのか ご教授願います。

  • VC++でのファイルの読みこませ方

    タイトルではわかりにくいと思うのですが、実際はプログラム中である指定した形式で保存されたtxtファイルなどを開いて、その中にある文字列を配列に入れて, そのままの文字列をランダムに表示させたいのですが、なかなかいい方法が浮かびません。配列へ読みこませる関数ってあるんでしょうか?ファイルを開いてから詳しく教えていただけたら嬉しいです。 後、勉強のためにやってるので難しいというか高度なやり方があれば是非教えてください。おねがいします。

  • どのようなプログラムをつくればいいでしょうか?

    Perlをもちいて塩基配列のチェックをおこないたいんですがどのようなプログラムを作成したらいいのかがわからないので教えてください。 以下の塩基配列のデータファイル(1)があります 塩基配列の説明文~ 5’-ATATAGATAGATCATAGATCCCCGATAGCCCAGTAAATGATGACCCGATGATGACCCAGTACCCGGATGAGTAGTGATAGTACCCGTGTGTAAGTGATAGATAGTCCCATGTAGACAAAGATCCAGTAACGCGCGTTTTT-3’ これに対し、制限酵素A、B、Cを含んだデータファイル(2)があります。 ファイル形式は以下のような内容です。 制限酵素の説明文~ <1>A(制限酵素名) <2> <3> <4> 5’-A^TAGT-3’(認識部位) このデータファイル(1)に対し、(2)のファイル内の制限酵素A(認識部位5’-A^TAGT-3’)で切断する位置の数、位置の場所を表す番号(塩基配列の中の何番目か)を表示させるプログラムを作りたいんですがどのようにしたらいいんでしょうか? プログラムを実行する際には以下の手順を踏んでおこないます。 ./プログラムファイル名.pl 塩基配列ファイル名.fasta 制限酵素データファイル.txt 制限酵素名前(ここではAとする) これらをおこなうために必要な点として自分が考えているのは、(2)のファイル内の制限酵素名Aを認識させるために正規表現で<1>を認識させるようにして、実行時に指定する制限酵素名がなければそこでプログラムを終了させ、逆に存在する場合は、塩基配列を認識する部位である<4> 5’-A^TAGT-3’(認識部位)の部分を読み込んで(1)のファイル内の塩基配列認識部位の数と位置を表示させるプログラムを組み込めばいいのではないかと考えているのですが、<1>A(制限酵素名)があった場合に<4> 5’-A^TAGT-3’(認識部位)を認識させるためにはどうしたらいいんでしょうか?

    • ベストアンサー
    • Perl
  • Excel INDEX関数の使い方

    添付図はA列B列にデータが入っており E1:E5のようなリスト(部署一覧)を用意しておき C列に部署名をとりだそうというものです C2に =INDEX(部署一覧,MATCH(1,FIND(部署一覧,B2),0)) という数式を入力してCtrl+Shift+Enterで配列数式にすれば部署名を取り出せるとありました 1.その通りにやってなるほど部署名はとりだせたのですが MATCH関数の引数に”1”とあるのがその意味が分かりません どなたか解説をお願いできないでしょうか 2.また部署名の前に別の文字列 例えば”関東支社”のような文字列がある場合 部署名だけを取り出すことはできないものでしょうか よろしくお願いします

  • MySQLのインデックスについて

    MySQLのインデックスについて 以下のSQLにてお聞きしたいことがあります。 SELECT * FROM table1 WHERE num = '1' numはint型でインデックスを作成済の列なのですが、 問い合わせでは'1'のように文字列型で条件指定しています。 この場合、numに対するインデックスは効くでしょうか? よろしくお願い致します。 追伸 なぜこのような質問をさせて頂くかと申しますと、 私は開発環境でZend Frameworkを使用しておりまして、 その中のZend_Dbを使用しているのですが、 名前つきパラメータを使用してSQLを実行した場合に、 実際の実行されているSQLではどのパラメータも、 シングルクォーテーションで囲われているのではと思うんです。 以前、SQL実行に失敗して出力されたエラーメッセージの一部に、 実際に実行されたSQLが記述されていたのですが、 数値型の列もシングルクォーテーションで囲われていたんです。 もしかしたら名前つきパラメータを使用すると、 すべてのパラメータが文字列型扱いされているのではと思い、 こちらに投稿させて頂きました。

    • ベストアンサー
    • MySQL
  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。

  • この問題がわかりません・・・

    この問題がわかりません(-_-;) 7個×2行分のデータをdata配列に読み込みというところが理解できず何度もやってみたのですが解けませんでした・・・答えが載っておらず困っています(@_@;) C言語詳しい方よかったら回答お願いします<m(__)m> 次の2行の内容でtest614.txtファイルを作成しなさい。 1 2 3 5 8 13 21 1 2 2 4 8 32 256 ※スペース区切りで7個の数字2行分。 int型2次元配列変数data[2][7]を宣言後、test614.txtファイルを開いて7個×2行分のデータをdata配列に読み込み、その内容を右のように表示する。続いて、test614.txtファイルを閉じてから、右のようにdata配列を用いて縦に並んだ数値を加算した結果を表示するプログラムを作成しなさい。 実行結果例 (実行結果例) 1 2 3 5 8 13 21 1 2 2 4 8 32 256 ------------------- 2 4 5 9 16 45 277

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • Excel2000ですがINDEX関数の使い方がよく分かりません。

    Excel2000ですがINDEX関数の使い方がよく分かりません。 開こうとすると、マクロにはウィルスが含まれている可能性があるとかの警告が出るのですが、この意味が実はよく分かりません。ちゃんとした勉強サイトからDLしたもので、ウィルスチェックしても感染ファイルはゼロと出るので安全だとは思うのですが・・・。 Excelの問題を見て頂けますか?→http://www.geocities.jp/rankei32000/book1.xls ダメなら→http://www.geocities.jp/rankei32000/yookyuusho1.htm 先ず、どのようにしたら、こんなカウンターのような便利なものが作れるのでしょうか? 作り方を教えて頂けませんか? INDEX関数をにわか勉強したばかりで余りまだよく分かっていません。行と列で指定するようですが、今回の問題ではどう考えたらいいのでしょうか? 「カウンターのようなもの(黄色地にコードと書かれた部分)」が「行」に相当するようですが、何故これが「行」に相当するのでしょうか? INDEXというよりもVLOOKUPのような指定の仕方に見えますが・・・。 よろしくお願いします。

  • Perlのプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?

専門家に質問してみよう