perlの検索画面でのCSVデータ検索についての質問

このQ&Aのポイント
  • perlでの検索画面でCSVデータを検索する際に、指定範囲外のデータも引っかかるようにしたい場合の方法について質問です。
  • 現在の実装では、query_price1とquery_price2で指定された範囲内のデータのみが引っかかります。
  • query_price2が指定されている場合、指定された範囲よりも高い賃料のデータも引っかかるようにしたいです。同様に、query_price1が指定されている場合には、指定された範囲よりも低い賃料のデータも引っかかるようにしたいです。
回答を見る
  • ベストアンサー

perlでの検索画面についての質問です。

CSVのデータを検索システムで、 例えば、 賃料 [30000]~[50000] と入力し検索した場合に [35000]~[52000]というデータも引っかかるようにしたいんですがどのようにすればいいんでしょうか? 現在はこのようになってます。 if($param{'query_price2'} and $param{'query_price1'}){ if($param{'query_price1'} >= $datas[21]){ next; } if($param{'query_price2'} <= $datas[22]){ next; } } elsif($param{'query_price2'} or $param{'query_price1'}){ if(!$param{'query_price2'}){ if($param{'query_price1'} >= $datas[21]){ next; } } if(!$param{'query_tsubo1'}){ if($param{'query_price2'} <= $datas[22]){ next; } } $datas[21]、[22]は賃料のデータが入っている要素数です。 query_tsubo1、2は検索画面で入力したものです。 賃料:[30000(query_price1)] ~ [50000(query_price2)]

  • Perl
  • 回答数1
  • ありがとう数0

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

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

その「データが引っ掛かる」というのは, 何を見てそう思えばいいんでしょうか? 例えば $param{query_price2} <= $datas[21] || $datas[22] <= $param{query_price1} でもいい? ちなみに「data」は複数形だったりします. 単数形は datum だけど, あんまり使われない.

関連するQ&A

  • 以下の文を書き足したらエラーになりました。

    文法というか書き方がそもそもおかしいですか? if($param{'query_price2'} and $param{'query_price1'}){ unless(($param{'query_price1'} <= $datas[32]) && ($datas[32] <= $param{'query_price2'} <= $datas[33])){ next; } unless(($datas[33] >= $param{'query_price1'} >= $datas[32]) && ($param{'query_price2'} >= $datas[33])){ next; } } elsif($param{'query_price2'} or $param{'query_price1'}){ if(!$param{'query_price2'}){ if($param{'query_price1'} > $datas[32]){ next; } } if(!$param{'query_price1'}){ if($param{'query_price2'} < $datas[32]){ next; } } }

    • ベストアンサー
    • Perl
  • perlの質問

    #!/usr/local/bin/perl require 'jcode.pl'; # 漢字コード変換ライブラリ #********** データを受け取る $query = $ENV{ 'QUERY_STRING' }; &parse_param( $query ); $name = $param{ 'name' }; # 投稿者 $email = $param{ 'email' }; # メールアドレス #********** 結果の出力 print "Content-type: text/html\n\n"; print "投稿者:".$name."<BR>"; print "メールアドレス:".$email; exit; #********** 入力したデータの分解 ********** sub parse_param {  local( $name, $value );  local( $parse_data ) = @_;  @in_params = split( /&/, $parse_data );  foreach $in_param ( @in_params ) {   ( $name, $value ) = split( /=/, $in_param );   $value =~ tr/+/ /;   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;   &jcode'convert( *value, 'sjis' );   $param{ $name } = $value;  } } の $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack の部分だけ、何の処理をしているかがいまいちわかりません。 わかる方お願いします。

    • ベストアンサー
    • Perl
  • PERL sendmailセキュリティ対策について

    cgiを直接呼び出して、メールを送信されてしまうエラーについて質問させてください。 以下のように、sendmailを利用するサブルーチンを呼び出しています。 if ($query->param('confirm')) { #←初期値は""で一番下のelseに飛ぶ # input data check my @err_lst = (); #←入力チェックしてエラーメッセージを蓄積 if (&InputCheck($query, \@err_lst)) {#←入力内容をチェック # ok &NextPage($query); #←確認画面を表示 } else { # error &SamePage($query); #入力内容にエラーがある場合、入力画面に戻す } } elsif ($query->param('send') eq "送信") { # send mail & make log &SendMail($query); #メール送信用サブルーチン } else { # make init form &InitPage($query); #CGI起動直後はこのサブルーチンから入力フォームを表示 } この書き方ですと、 <input type="hidden" name="confirm" value=""> <input type="hidden" name="send" value="送信"> で、直接「&SendMail($query);」が起動してメール送信されてしまいます。 メール本文やアドレスの文字エスケープ処理は動いているのですが、 sendmailを呼び出す前には、必ず入力内容をチェックするサブルーチンを通る事を 強制する方法はないでしょうか。 当方、この修正の為にこの2週間突貫でPERLを独学している素人の為、 上記事例について読んでおくべき参考書などがあれば、お教えいただけますと とてもとても助かります。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 削除ボタンを押すとperlにてデータを削除するようにしたいんですができません。

    フォーム.html(一部) <form name="form1" method="post" action="admin.cgi"> <input type="hidden" name="mode" value="edit3"> <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><b>クライアント(ロードサイド)</b> <input type="hidden" name="group" value="1"> <br> ※前のページへ戻る場合には、ブラウザの戻るボタンでお戻りください。</td> </tr> </table> <br> <table width="740" border="1" cellspacing="0" cellpadding="10" align="center" bordercolor="#333333"> <tr> <td bgcolor="#FFEEEE">このデータを削除する場合には、下の削除ボタンをクリックしてください。<br> ※この作業は取り消しができませんので、よく確認してから削除ボタンをクリックしてください。<br> <br> <input type="button" value="物件NO: _%data_num%_ を削除する" onClick="location.href='admin.cgi?mode=del&group=_%group%_&data_num=_%data_num%_'"> <br> この「物件NO: 」のボタンを押すとadmin.cgiに飛び データファイル内のデータを空にします。 ----------------admin.cgi---------------------------------- if($param{'mode'} eq 'del'){ ##===================================== ## 物件データをオープン = ##===================================== if($param{'group'} eq '1'){ $datafile = $datafile1;} elsif($param{'group'} eq '2'){ $datafile = $datafile2;} elsif($param{'group'} eq '3'){ $datafile = $datafile3;} if(!stdio::lock($lock)){ error('システムエラー','只今混み合っております.'); } # ロック if(!open(DATA,"+<$datafile")){ stdio::unlock($lock); &error('システムエラー',"ファイル ( $datafile ) をオープンできませんでした。"); } @data = <DATA>; foreach(@data){ @data2 = split(/,/); if($data2[0] eq $param{'data_num'}){ $_ = ''; last; } elsif($data2[0] eq $param{'data_num2'}){ $_ = ''; last; } } seek(DATA,0,0); print DATA @data; truncate(DATA,tell(DATA)); close(DATA); stdio::unlock($lock); ##===================================== ## テンプレートオープン = ##===================================== if(!open(HTML,$html_finish)){ &error('システムエラー',"ファイル ( $html_finish ) をオープンできません。"); } @html = <HTML>; close(HTML); ##===================================== ## HTML出力 = ##===================================== print <<"EOF"; Content-type: text/html @html EOF exit; } # モード del ここまで ----------------------------------------------------- この「data_num2」の削除には成功するんですが 「data_num」の場合はボタンを押しても何も起こりません。 恐らく「data_num」のif文に行っていないのだと思うんですが、 何が原因か分かりません。 情報が少ないかもしれませんが 解決の糸口をお願いします。 データはcsv形式のファイルです。

    • ベストアンサー
    • HTML
  • 元号判定:Perl初心者です

    Perlにおいて、「元号を判定させる」ようにしたく、if-elsif文章を書いてみたのですが、上手くいきません。 (そもそも起動してくれないです・・・文章も合っているかわからないのですが。。) 年号を入力させて、 (meizi) X nenと表示させたいのです。 あと、明治以前の数字を入れたら、エラーと出すようにする。 被っている年号、例えば1912年と入れたら、meizi45nen/taisyou1nen ともしたいのですが、これらはどう入れたらいいのか分からなかったです。 どこを直せばいいのか、一部でもいいので、教えていただけると嬉しいです。 chomp($year = <stdin>); if($year<=1912 and $year>=1868){ $A=$year-1867 print("meizi $A nen \n"); } elsif($year<=1926 and $year>=1912){ $B=$year-1911 print("taisyou $B nen \n"); } elsif($year<=1989 and $year>=1926){ $C=$year-1925 print("syouwa $C nen \n"); } elsif($year>=1989){ $D=$year-1988 print("heisei $D nen \n"); }

    • ベストアンサー
    • Perl
  • [Perl]抽出について

    再度質問させていただきます。 本当は質問などせずに自力で解決したいのですがなかなかうまくいかなくて困っています… 前回質問させていただいたとき(http://okwave.jp/qa/q7855819.html)には問題なかったのですが、事情がかわってしまい、ifの中の条件を変更しなければならなくなりました。今回はIPアドレスではなく時間抽出です。 以下のメールヘッダに対して、後述するプログラムを実行します。 Received: from ************.jp (**********.jp [158.217.43.2]) by **********.abc.jp ; Wed, 29 Feb 2012 12:17:31 Received: from ************** (localhost [127.0.0.1]) by localhost (Postfix) with SMTP ; Wed, 29 Feb 2012 12:16:23 Received: from **************.jp (***********.jp [158.217.208.11]) by ************.abc.jp ; Wed, 29 Feb 2012 12:15:54 #ここがほしい Received: from **************.jp (***********.jp [158.217.208.11]) by ************.xyz.jp ; Wed, 29 Feb 2012 12:15:14   From: ************** To: *********@***********abc.jp Subject: = ***** Date:Wed, 01 Mar 2012 21:06:24   #ここがとれてしまう . . . 本文 ~略 $file_data_str = join("", @file_data); @received_datas = split(/Received:/, $file_data_str); @received_datas = reverse(@received_datas); foreach $sorted(@received_datas){ if(($sorted =~ /abc.jp/) and ($sorted =~ /(\w+,\s+\d+\s+\w+\s+\d+\s+\d+:\d+:\d+)/)){   $new_file_name = str2time($1);   $min1 = $new_file_name / 300;   $min1_cut = int( $min1 );   print $min1_cut; last; } } } exit; まず、Received:で区切って、reverseしているのではじめの要素は、元のメールヘッダの最後のReceivedフィールドから本文まであることになります。更にIfで指定してる条件のアドレスがTo:にも出現するのでそこも判定されます。なのでプログラムを実行すると、To:のabc.jpとDateの時間にひっかかってしまい、Dateの時間情報を抽出してしまいます。 あくまで取りたいのはReceivedフィールドの中の時間情報なのですが、何かいいやり方はありませんでしょうか?ちなみに やり方としては、初めの要素を消す、shiftとか使えるかな、と考えたりもしましたがうまくいかず…、Receivedフィールドのみで判定させたいです。 ご教授願えたらと思います。よろしくお願いします。

  • SQL文のあいまい検索で・・

    初心者ながらの質問ですみません。 いくつか検索条件を入力し、該当するものを取り出したいのですがうまく取れません。 状況として1ユーザーに対して3箇所のカラム(price1,price2,price3)のいずれかに数字が入っており、それの数字に対して*円以上のものという検索をかけたいのです。 現状では select * from テーブル名 where price1>='$price' or price2>='$price' or price3>='$price' という状態なのですが、エラーは出ずに関係ないものまで取ってきてしまう状態です。 どなたかお分かりになる方がいらっしゃいましたら是非ご教授願います。

    • ベストアンサー
    • PHP
  • Access検索フォームで範囲を指定しての検索

    クエリーで計算して出した結果をもとにフォームを使って検索をしたいのですが、うまくできません。 クエリーの計算式は誕生日から年齢を出すものが入っています。 フォームのボタンにVBAで '年齢 If Me!年齢開始.Value <> "" Then Age1 = "(Q_メイン.年齢 >= " & "0" & " and =< " & Me!年齢終了.Value & ")" WhereCond = WhereCond & tempOper & Age1 End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond となっています。 tempOperは、検索方法がORとANDが選べるようになっていて、それの結果が入っています。

  • Access2007 フォームでのOR検索

    Access歴は2カ月程度です。 クエリから作成したフォームの中でのOR検索を行いたいのですが フィールド名・・・工具名,使用番号 検索に使用する非連結txtbox・・・工具名条件,使用条件 となっており、 Private Sub 検索_Click() If [工具名条件] <> "" Then 検索文字 = 検索文字 & " and 工具名 like '*" & [工具名条件] & "*'" If [使用条件] <> "" Then 検索文字 = 検索文字 & " and 使用番号 like '*" & [使用条件] & "*'" If 検索文字 = "" Then Me.FilterOn = False Else Me.Filter = Mid(検索文字, 6, 2000) Me.FilterOn = True DoCmd.Requery End If End Sub となっており、工具名と使用番号のAND検索は出来ているのですが、使用番号が1~6あり、 OR検索を使用して2つを検索条件にし、それぞれ該当している結果を表示させたいのですが。。。 工具名はカタカナや漢字のみです。 使用番号は「1,2,3」等と入力してあります。 クエリの抽出条件は無記入です。 どうぞ、よろしくお願いします。

  • perlで正常に検索できない

    CGI RESCUE さんの 簡易データベースでdatファイルを検索しようとしています。。 http://www.rescue.ne.jp/cgi/database/ キーワードで検索をしようとしているのですが、うまくヒットしません。 CGIは以下のようになっています。 # キーワード(フリーワード)  if ($FORM{'keyword'} ne '') {   if ($com5 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; }   elsif ($com4 =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'keyword'}/i) { ; }   else { next; } } $com5には「スズキ用<br>ドアトリム<br>バックミラー」と入っていたとします。 「スズキ」または「ドア」・「ドアトリム」・「トリム」と入力すると、ヒットします。 「バック」または「バックミラー」で検索するとヒットしません。 改行が悪いのかと思い、 $com5を「スズキ用ドアトリムバックミラー」に修正してみました。 同じように「スズキ」等はヒットするのですが、「バック」または「バックミラー」で検索するとヒットしません。 「バックミラー」と言う語句がヒットしないのかと思ったのですが・・・ $com5を「バックミラードアトリムスズキ用」に修正したとします。 「バック」・「バックミラー」でヒットします。 また、「ドア」・「トリム」まではヒットしますが、「スズキ」・「スズキ用」になるとヒットしなくなります。 全くヒットしなかったり、動作しないわけではないので、そもそもが間違っているとかではなく検索する部分で何か文字数制限があるような感じですが、これはどこを修正したら良いでしょうか? 他に情報を記入しないといけない物があれば指摘お願いします。

専門家に質問してみよう