• ベストアンサー

配列から効率よくマッチさせるには

配列からなるべく高速にマッチさせたいと思っているのですが、 たとえば、以下のようにリストをlist.datへ保存させている場合で キーワード1<>filename1<>time1<> キーワード2<>filename2<>time2<> フォームから入力されたキーワードとマッチさせてfilenameの要素を 取り出すといった場合、通常の配列ループを利用すると open(IN,"list.dat"); while (<IN>) { ($key,$name,$time) = split(/<>/); if($FORM{'key'} eq $key) { last; } } のようにしてフォームで入力したものとマッチさせるような 形になると思いますが、連想配列と言うものを活用すると もっと効率よく高速に処理できるのでしょうか? もしよろしければ出来る限り効率の良い方法(ソース)を 教えていただけましたら幸いです。

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

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

  • ベストアンサー
  • qtea
  • ベストアンサー率77% (38/49)
回答No.2

この場合だと、CGIのようなので、連想配列に入れても、さほど効率はあがらないのではないかと思います。 それに、単純に上からテキストファイルを読んで、検索するのは、それほど遅くないと思いますし… ただ、前の質問を読んでいて思ったのですが、キーワードを単にunpcackして、それをファイル名にしたら、どうなのだろう?と思いました。 締め切りになってるから、こちらに書いておきますね。 $filename=unpack("H*",$keyword); これだったら、ファイル名を保持しておくファイルが必要ないので、ちょっと、楽かも。 あと、蛇足ですが、$FORM{'key'}の値の前後の空白は…どうするか考慮したほうが良いかも。

miku881
質問者

お礼

ありがとうございます。 unpcackと言う方法があるのですね。 とても助かりました。 これならファイル名にしても大丈夫ですね。 やはりリスト化してしまうとファイルが肥大化した際に 照合処理で結構時間がかかって、せっかくのキャッシュが 遅くなってしまうようですので ご教授いただいた方法で直接読み込ませるようにしたいと思います。 ありがとうございました。 (空白のご指摘もありがとうございます) 未熟ですのでまた質問してしまうかもしれませんが、 何卒宜しくお願い致します。

その他の回答 (1)

  • kingkom
  • ベストアンサー率0% (0/1)
回答No.1

まず、データの格納をDBにするとアクセスは楽です。 キーワードを要素にする連想配列を作ります。 ----- db作成 ----- use DB_File; tie %db, "DB_File", '/hogehoge/foo/bar.db' foreach $key ('キーワード1','キーワード2','キーワード3'){ $db{$key}="filename\ttime"; } ------------------ #ちなみに、質問者の前の質問を見ていましたが、  DBに格納してしまえば、キーワード事のファイル名を作成する  必要はないと思います。キーワードをキーにするDBに格納して  しまえば、よい。 こうしておけば、以下のように取り出せます。 ----------------- use DB_File; tie %db, "DB_File", '/hogehoge/foo/bar.db' if($db{$FORM{'key'}}){  # DBにデータある時の処理 } else { # DBにデータがないときの処理 } ----------------- どうでしょう?

miku881
質問者

お礼

ありがとうございます。 データベース化はまだ挑戦したことがありませんでしたので、 とても勉強になりました。 はじめにこちらを挑戦してみたのですが、 未熟さゆえに上手くいきませんでした。 データベースは一応作成されているのですが、 あらたにキーワードを打ち込むたびに消えてしまったり、 よくわからないのですが、生成までに時間がかかって、 いざ照合する際に存在していなかったり・・・ 少し時間が経つとデータベースに出現していたりと 何度やってもうまくいきませんでしたので、今回は 断念しました。せっかくご教授いただいたのにすいません。 またお世話になってしまうかもしれませんが宜しくお願い致します。 ありがとうございました。

関連するQ&A

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • 二次元配列への格納

    ファイル名:log.dat は以下の構造をしています。 "Key-01"|"参照"|"P2"|"yamada" (\n\r)←改行 "Key-02"|"書込"|"P5"|"minami" (\n\r)←改行 "Key-03"|"参照"|"P3"|"yamada" (\n\r)←改行 open(IN,"log.dat") || die "log.dat",": $!"; @log=<IN>; close(IN); で@logにデータを読み込んだ後、 foreach(@log){ $data = $_; $data =~ s/ //g; $data =~ s/\n//g; $data =~ s/\r//g; $data =~ s/"//g; @second =split(/\|/ , $data); <---(1) で配列@secondに格納するのですが、 この時、@secondを(\n\r)=改行で区切るように二次元配列にしたい のです。 @second = ( [ Key-01 , 参照 , P2 , yamada ] [ Key-02 , 書込 , P5 , minami ] [ Key-03 , 参照 , P3 , yamada ] ) 上記<---(1) の部分をどのように変更すればいいでしょうか。

    • ベストアンサー
    • Perl
  • データの抽出、配列操作で教えて下さい。

    こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータをuser.datとします。 1<>yamada<>99999<> 2<>tanaka<>22222<> 3<>suzuki<>10101<> 4<>yamada<>12345<> 5<>yamada<>55555<> user.datの中からyamadaの行だけ取り出して 3番目の数字データでソート表示したいのですが なかなかうまくいきません。 open(F,"user.dat"); @load_txt = <F>; close(F); foreach $data (@load_txt){ if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} } @txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 上記でおかしな所ありましたらご教示頂きたく 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 無名配列からハッシュを作りたいのですが・・・

    $VAR1 = [ 'No', 'a', 'i', 'u', 'e', 'o', ]; #VAR1と同じ数の<>区切りの下記のようなデータを読み込み配列に代入 --List----------------------- 1<>あ<>い<>う<>え<>お<> ------------------------- foreach(0..$#List){ @Array=split(/<>/,$List[$_]); } 最終的なイメージは print "$a{No}"; >1 print "$a{a}"; >a となるよう、上記VAR1の無名配列の値をキーに、読み込んだ<>区切りのデータを関連付けて表示させるようにしたいのです。 foreach my$var(@$VAR1){ ...ここをどうすれば配列の値をハッシュのキーとして作成出来るのか頭を悩ませてます。 } 先輩方のお知恵をお借りできませんでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • if文条件式で配列を使用したい

    if文条件式で配列を使用したい 例えば open (FH, "<data.dat"); @list = <FH>; で不確定要素数を@listに格納したあと if文でその@list内でマッチングする物があればそれだけ表示させたいのですが #ここでは比較対象をabcとして foreach(@list){ if( abc eq @list){ } } としてもtrue処理が出来ません。 どの用に条件を書けばよいのでしょうか?

    • ベストアンサー
    • Perl
  • javascriptの配列の検索について

    テキストエリアに入力された文章を、改行ごとで配列に格納 その後、特定の文字を検索し、特定の文字がある配列を見つけて 見つかったものに処理をかけたいです 現在、配列に格納するところまでできているのですが、その後の文字を検索するところで躓いてます。 配列をmatchで検索すると一番最初の配列にのみ処理をかけてしまっているのが現状です。 どなたかお知恵を貸していただけないでしょうか よろしくお願いします。 例 入力された文字列:                明日の時刻のお知らせ                開始時間:10時30分                受付開始は10時00分からとなっております。                遅れないようにお願いいたします。 検索する文字:  時間     ↓ 検索ワードを含む配列:開始時間:10:30     ↓これに処理かけて 出力:10:30 検索ワードが見つからない場合 出力:10:00 10:30 という形にしたいです。 プログラムは下記のように組みました。 //////////////////////////// <html> <head> <script language="JavaScript"> function tester(){ var str= document.getElementById('input_text').value; var time; var alltime; abc = str.split(/\r\n|\r|\n/); var g = ["開始時間"]; for (var i=0;i<abc.length;i++){ if(abc[i].match(g)){ time = abc[i].match(/\d{1,2}:\d{1,2}/g); if(time2 !=null){ alert(time); document.write(time); break; } }else{ alltime = str.match(/\d{1,2}:\d{1,2}/g); if(alltime !=null){ document.write(alltime); } }break; } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • 配列データをキーワード検索

    こんばんは。お世話になっております。タイトルにあるように配列内にあるデータを、キーワード検索をしたいと考えておりますが、テキストフォームに入力したキーワードが反映できずにいるため、アドバイスを頂戴したく投函させていただきました。 $string=array( "1組 男 高木義男 明るい性格 ok", "2組 女 高島幸子 根暗な性格 ok", "3組 男 飯田彰浩 前向きな性格 no", "2組 男 木下敏明 努力家 ok", "3組 女 結城聡子 心配性な性格 no", "1組 女 佐藤恵子 明るい性格 ok", ); 以上のような配列があり(各データのスペースはタブ区切りです)、テキストフォームで入力したキーワードを 最後のokとなっているのを条件に、名前の欄と性格の欄から、OR検索(*)をしたいのですが、上手く検索させることが出来ません。 *テキストフォームにてスペースでキーワードを入力したとき、OR検索としたい。 お忙しい中恐縮ですが、ご指導いただけたら幸いです。宜しくお願い致します。 以下が実際に記述している現在のソースです。 (テキストフォームにて入力されたキーワードをGETで送信しています) $key = urldecode($_GET["key"]); $key = mb_convert_encoding($key, 'EUC-JP', 'auto'); $key = mb_ereg_replace(" ", " ", $key); $arr = explode(" ",$key); foreach($arr as $keyy){ $wherearr[] = "(strstr($site_data_array[2], $keyy) OR strstr($site_data_array[3], $keyy))" ; } $wherestr = "(".implode(" OR ",$wherearr).")"; if($key != ""){ for($i=0; $i<$count; $i++){ $site_data = $string[$i]; $site_data_array = explode(" ", $site_data); if($wherestr AND trim($site_data_array[4]) == "ok"){ $search_array[] = implode("\t", $site_data_array);//この配列データを表示 } } }

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • 入力フォームにおける配列データに関して

    こんにちは。お世話になっております。 タイトルにあるように、フォームの中に入力されたデータを配列として、POSTするようなものを作成しました。 こんな感じ。 <p>ファイル</p> <input name="fl[]" type="file" size="50"><br> <input name="fl[]" type="file" size="50"><br> <input name="fl[]" type="file" size="50"><br> <p>キーワード</p> <input type="text" name="keyword[]" size="18"><br> <input type="text" name="keyword[]" size="18"><br> <input type="text" name="keyword[]" size="18"><br> このフォームは、ファイルをアップロードし、かつ各ファイル毎に関連するキーワードを入力・登録させるためのものですが、データをPOSTしたとき、ファイルもキーワードも配列としているので、ファイル1段目とキーワード1段目。ファイル2段目とキーワード2段目・・・といった形で配列に格納されるものと思っておりましたが、ファイルがローカル上の同じフォルダ内にあるものに限っては、配列への格納順が保たれるのですが、違うフォルダからアップロードさせると、配列への格納順が保たれないことに気付きました。 そもそも、上記のようなフォームの作成は誤っているものなのか? それとも、このような場合、違う形式でのフォームを作成すべきなのか?などなど・・ 経験の乏しい私には解決策が見出せずに、今回投函させていただいた次第です。 お忙しい中恐縮ですが、アドバイスなど頂戴出来れば幸いです。 宜しくお願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう