CSVデータの前後のキーワードを取得する方法

このQ&Aのポイント
  • PHPを使用して、CSVデータから特定のキーワードを抽出し、その前後のキーワードを表示する方法について説明します。
  • CSVファイルを開き、キーワードを検索し、該当するデータを取得します。
  • 取得したデータを元に、前のデータと次のデータのリンクを作成し、表示することができます。
回答を見る
  • ベストアンサー

csvの特定キーワード抽出後、その前後のキーワードを表示するには

csvの特定キーワード抽出後、その前後のキーワードを表示するには -----sample.csv f01,名前01,説明01 d03,名前02,説明02 y12,名前03,説明03 -----呼び出しhtml sample.php?key=d03 -----sample.phpの処理 <?php $file_name = "sample.csv"; $file = @fopen($file_name, "r") or die("Data File Open Error"); flock($file, LOCK_SH); while (!feof($file)) { $buf = fgets($file, 4096) ; $data = split(",", $buf) ; if ($data[0] == $_GET["key"]) { $sampleid = $data[0] ; $samplename = $data[1] ; $sampleexp = $data[2] ; } } flock($file, LOCK_UN); fclose($file) ; ?> <h1><?php echo $samplename ?></h1> <h2><?php echo $sampleid ?></h2> <p><?php echo $sampleexp ?></p> 上記のようなフローの時に、sample.csv内の前後のデータをsample.php内で呼び出したいのですが、どうコードを書けばいいのかご教示ください。↓ <a href="ひとつ前のデータ">ひとつ前のデータ</a> <a href="ひとつ後のデータ">ひとつ後のデータ</a>

  • PHP
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.2

whileで回すのであれば、フラグを立てて判定すればよいでしょう。 ~ if($data[0] == $_GET["key"]){   ~   $flag = true; //HIT済みの印を入れる //印があれば次のデータということ。後は必要ないのでbreak; }elseif($flag){   $data_next = $data;   break;    //HITするまで前のデータをkeepしておく }else{   $data_prev = $data; } 後はご存知かとは思いますが、リンク部分 echo <<<EOL <a href="sample.php?key={$data_prev[0]}"> ひとつ前のデータ </a> <a href="sample.php?key={$data_next[0]}"> ひとつ後のデータ </a> EOL;

kaitom
質問者

お礼

ありがとうござました。 参考にさせていただきます。 今後ともよろしくお願いいたします。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

exec()などでgrepした方がよいような気がしますが?

関連するQ&A

  • CSVを使ったパスワード変更処理について

    CSVを使ったパスワード変更処理について 以下のソースをどういじれば変更が可能か申し訳御座いませんが、 どなたか分かるかたご教授願いますでしょうか? $post = $_POST; $org_file=fopen("logindata.csv","r"); $tmp_file=fopen("guest.tmp","w+"); flock($org_file,LOCK_SH); flock($tmp_file,LOCK_EX); $line =date("Ymd-H:i:s").","; $line.=$_POST['mail'].","; $line.=$_POST['pw2'].","; fputs($tmp_file,$line."\n"); while($row=fgets($org_file,1024)){ if($temp[1]==$post['mail'] && $temp[2]==$post['pw']){ } else{ fputs($tmp_file,$row); } } flock($tmp_file,LOCK_UN); flock($org_file,LOCK_UN); fclose($tmp_file); fclose($org_file); unlink("logindata.csv"); rename("guest.tmp","logindata.csv"); echo "パスワード変更しました。"; exit;

    • 締切済み
    • PHP
  • csvの特定のキーワードを指定して、そのキーワードを含む行を表示させる方法

    こんにちは。いつも参考にさせてもらっています。 さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。 自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。 よろしくお願い致します。 <?php $openfile = file_get_contents('sq-tyo.csv'); $csv_gyo = split("\n", $openfile); echo "<div>"; list($from, $class, $to, $type1, $type2, $kikan) = split(",", $csv_gyo[0]);//1行目 echo "<table>"; echo "<tr>"; echo "<td>"; echo "<b>出発地</b>"; echo "</td>"; echo "<td>".$from."</td>"; echo "<td>"; echo "<b>座席クラス</b>"; echo "</td>"; echo "<td>".$class."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>目的地</b>"; echo "</td>"; echo "<td>".$to."</td>"; echo "<td>"; echo "<b>種類</b>"; echo "</td>"; echo "<td>".$type1."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>経路</b>"; echo "</td>"; echo "<td>".$type2."</td>"; echo "<td>"; echo "<b>期間</b>"; echo "</td>"; echo "<td>".$kikan."</td>"; echo "</tr>"; echo "</table>"; ?> 本当はデータベースを使用したいのですが、今回はcsv使用のみと言われてしまったので、ご協力をお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • csvデータを下から数えて10行目から最後までを表

    <?php if (have_posts()): ?> <?php if(isset($_GET['s']) && empty($_GET['s'])) { echo '検索キーワード未入力'; } else { echo '“'.$_GET['s'] .'”の検索結果:'.$wp_query->found_posts .'件'; // 検索キーワードと該当件数を表示 // chmodで書き込み権限を付与 $filename = chmod("test.csv", 0775); // PHPでcsvファイルを読み込みする $f_path = "test.csv"; var_dump($f_path); // 送信内容をShift_JISに変更 mb_convert_variables('Shift_JIS', 'UTF-8', $ShiftJIS); // 書き方はおそらくあってる $keyword_data = array(date('Y-m-d-G-i-s'), $_SERVER["REMOTE_ADDR"],$_GET['s'].PHP_EOL); // ファイルを開くか、新しいテキストファイルを作って最後に追加書き込み $fp = fopen('test.csv', 'a'); // ファイルに対する処理を行う前にファイルをロックして、作業中は他の人がそのファイルに作業を行えないようにする、排他的ロック flock($fp, LOCK_EX); // CSVファイルにフォームの送信内容を記入しています fputcsv($fp, $keyword_data); // ロック解除 flock($fp, LOCK_UN); // CSVファイルをクローズして終わり fclose($fp); } ?> <ul> <?php while(have_posts()): the_post(); ?> <li> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> </li> <?php endwhile; ?> </ul> <?php else: ?> 検索されたキーワードにマッチする記事はありませんでした <?php endif; ?> <?php setlocale(LC_ALL, 'ja_JP.UTF-8'); $fp = fopen('test.csv', 'r'); flock($fp,LOCK_SH); $rows = array(); while ($row = fgetcsv($fp)) array_push($rows, $row); flock($fp,LOCK_UN); fclose($fp); foreach (array_slice($rows, -10) as $row) vprintf("%s %s\n", $row); var_dump($row); ?> var_dump($row);で確認したところ 2021-09-07-4-27-36 126.156.166.227 2021-09-07-4-27-52 126.156.166.227 2021-09-07-4-31-03 126.156.166.227 2021-09-07-4-50-36 126.156.166.227 2021-09-07-4-52-03 126.156.166.227 2021-09-07-4-52-15 126.156.166.227 2021-09-07-4-52-26 126.156.166.227 2021-09-07-5-01-27 126.156.166.227 2021-09-07-5-14-25 126.156.166.227 2021-09-08-4-48-06 126.133.202.39 array(3) { [0]=> string(18) "2021-09-08-4-48-06" [1]=> string(14) "126.133.202.39" [2]=> string(40) "ううううううううううううう " } と出てます 2021-09-03-13-28-52,126.255.28.185,"ううう " 2021-09-03-13-29-46,126.255.28.185,"ううう " 2021-09-03-13-29-49,126.255.28.185,"ううう " 2021-09-06-14-43-33,126.204.198.239,"ううううううううううううう " 2021-09-06-14-45-37,126.204.198.239,"ううううううううううううう " 2021-09-07-3-09-52,126.156.166.227,"ううううううううううううう " 2021-09-07-3-10-34,126.156.166.227,"ううううううううううううう " 2021-09-07-3-15-56,126.156.166.227,"ううううううううううううう " 2021-09-07-3-17-27,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-07,126.156.166.227,"ううううううううううううう " 2021-09-07-3-24-29,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-04,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-19,126.156.166.227,"ううううううううううううう " 2021-09-07-3-25-33,126.156.166.227,"ううう " 2021-09-07-3-26-02,126.156.166.227,"ううう " 2021-09-07-3-26-40,126.156.166.227,"ううう " 2021-09-07-3-27-08,126.156.166.227,"ううう " 2021-09-07-3-27-27,126.156.166.227,"ううう " csvにはこのように表示されていて、下の10件最新のものを表示したいのですが、現状はIPと日時のみ表示されます。

    • ベストアンサー
    • PHP
  • textareaに改行を入れても、CSV上では一セルに収まる方法は?

    結論から言いますと、 textareaに改行を入れると、CSVファイルが下段に移ってしまいます。 やりたいとこ textareaに改行を入れても、CSV上では一セルに収まってほしいです。 いろいろ調べたのですが、以下のどこを書き換えればよいか分からないんです。 初心者なため困っております。宜しくお願い致します。 △△△△△△△△△△△△△△△△ ファイル名:input.php ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ <html> <head> <title>インプット</title> </head> <body> <h1 style="background:#cccccc">(書き込み)</h1> <form method="POST" action="write.php"> お名前: <input type="text" name="name" size="20" maxlength="30" /><br /> メッセージ: <textarea name="message" rows="4" cols="40">ここに感想を記入してください。</textarea> <br /> <input type="submit" value="送信" /> </form> </body> </html> △△△△△△△△△△△△△△△△ ファイル名:write.php ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ <?php $file=fopen("good.csv","a"); flock($file,LOCK_EX); $line =date("Y年 m月 d日 H:i:s")."\t"; $line.=$_POST['name']."\t"; $line.=$_POST['message']."\t"; fputs($file,$line."\n"); flock($file,LOCK_UN); fclose($file); header("Location: input.php"); ?>

    • ベストアンサー
    • PHP
  • fopenしてくれない。。。

    こんにちは。PHP初級者です。 postgresqlに入れたデータをCSVファイルに書き込んで、出力してみたいと思って以下のプログラムを作ってみました。 $file_name ="insatu.csv"; //データベースから呼び出し以下の$arrayへいれるデータは省略します。 //今回は1行のみのデータを入力プログラムになってますが、本当は何行もやるプログラムとなってます。 $array = compact("a","b","c","d","e","f","g","h","i","j","k","l"); $string = implode("," , $array); $file = fopen($file_name, "a") or die ("openエラー $file_name"); flock($file, LOCK_EX); fputs($file, $string."\n"); flock($file, LOCK_UN); fclose($file); $file = fopen($file_name, "r"); while($array = fgetcsv($file, 1000, ",")){ echo "<hr> \n"; for($i=0; $i< count($array); $i++){ echo $array[$i]."<br>"; } } fclose($file); なぜか最初の fopenで dieの方へ行って OPENエラーメッセージが出てきます。 この作業をするためには何かあらかじめ入れなくてはいけない構文とかあるんでしょうか?何か間違っていますでしょうか? それともphp.iniを設定するとかしなくてはいけないんでしょうか? php5を使用してますが、php.iniやphp.ini-distはともに見つからず。 困り果ててます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP
  • csvファイルを読み込み→上書きするスクリプト【添削願】

    csvファイルを読み込み→上書きするスクリプトを作ってみましたがうまく行かないときがあり原因を考えています。 100行程度のcsvから任意の行($idで指定したもの)を書き換えたいのですが、(テスト書き込みを)書き込んでくれるときと指定したその行だけ削除されてしまうときとまちまちです。 なぜ2パターンの結果がでるのでしょうか? お力をお借りできると幸いです。 <?php //データの取り出し $id = $_GET['id']; $data = file("data/file.csv"); //idで指定した行に書き込み $data[$id] ="テスト書き込み"; //csvファイルにデータの書き込み $file = fopen("data/file.csv","w+"); flock($file, LOCK_EX); for($i=0; $i<count($data); $i++) { fwrite($file,$data[$i]); } fclose($file); ?>

    • ベストアンサー
    • PHP
  • PHPとCSVの表示 もっとスマートにしたい

    現在PHPに手を出し始めた初心者です まだ分からない事だらけですが、できれば教えてください CSVファイルからデータを読み込んで表示するということを 苦戦しながらやっております ただ、1つのPHPファイルだけでの表示方法がわからず、今は3つのPHPファイルにしています 目的は大区分を選択後、小区分の一覧が表示され、小区分の1つを選択すると詳細が表示される という感じのものです まずCSVファイル 大区分,小区分,名称,詳細 1,101,hoge1,詳細1 1,102,hoge2,詳細2 2,201,hogex1,詳細x1 2,202,hogex2,詳細x2 3,301,hogexx1,詳細xx1 という感じに分けています で1つ目のhoge0.phpで <a href="hoge1.php?code=1">大区分(1)</a> ・・・ code が 1 なら hoge1.php で 小区分 1 の一覧を表示します 次に2つ目のhoge1.phpで $code = $_GET['code']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line); if ($bno==$code) { echo "<a href=hoge2.php?type=$sno>詳細</a>".$name."<br>"; } } type が 101 なら hoge2.php で 小区分 101 にある hoge1 項目の詳細を表示します 最後3つ目のhoge2.phpで $type = $_GET['type']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line);{ if ($no==$type) { echo $name.$detail; } } } 一応これでやりたい事は実現できたのですが、あまりにも不恰好で・・・ これを1つのPHP内で処理できるようにするにはどうしたらいいでしょうか? スマートになるやり方があれば教えてください

    • ベストアンサー
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP

専門家に質問してみよう