• 締切済み

ファイル内の検索・表示方法

PHP初心者です。 どうしても分からないので、質問させていただきます。 -----data.txt----------------- 2004/01/01,2005/04/01,aaaaaaaaaaaaaaaaaa 2004/01/03,2004/01/01,nnnnnnnnnnnnnnnnnn ・ ・ ------------------------------ index.php、data.csvの2つのファイルを使用します。 PHPでdata.txtのファイル内を検索し、 最初から一行ずつ、data.csvの第一フィールド・第二フィールド(2004/01/01,2005/04/01)の日付と 「2004/02/01」を比較し、第一フィールド・第二フィールドともに「2004/02/01」以前だったら、 その行を出力し新規ファイルに書き出し。 というスクリプトを作成したいのですが、どうなりでしょうか? どなたかご教授ください。

みんなの回答

  • manimani2
  • ベストアンサー率70% (12/17)
回答No.4

No.3さんのおっしゃると通り、どこで躓いたかわかりませんのでコードの書きようもありませんが、まぁ、たぶん「fget」や「explode」や「配列」とかを、それぞれ調べれば、だいたい掴めてくるのではないかと。 (何かのテキストエディタで、data.txtというファイルを、ちゃんとカンマ切りのCSVにしてしまうのもアリかもしれませんよ。ある程度機能の付いたフリーのエディタなら、「@@@@@」を「,」に置き換える事くらいワケないはず。以上、参考までに・・・。)

全文を見る
すると、全ての回答が全文表示されます。
noname#87667
noname#87667
回答No.3

だから、どこまでできていて、どこで躓いているのかを書かないと誰も答えられませんって。No.2さんのサンプルをどう書き換えたのか、そこで得られた結果が期待していた結果と違っているのはどこかなどを明記してください。 丸投げはネチケット違反ですよ。

全文を見る
すると、全ての回答が全文表示されます。
  • manimani2
  • ベストアンサー率70% (12/17)
回答No.2

こんにちは。 <?php $filename = "data.csv"; $row=0; $data = array(); //2004/02/04を日付で比較できるように変換 $time_base = strtotime("2004/02/04"); //CSVファイルの中身を読みながら、日付を比較していく処理 $handle = fopen($filename, "r"); while (($tmp = fgetcsv($handle, 1000, ",")) !== FALSE) { //第1、第2フィールドに日付ですよね。 //ここでは第3フィールドには日付以外の情報が入っていると仮定しています。 $data[$row]["time_1"] = $tmp[0]; $data[$row]["time_2"] = $tmp[1]; $data[$row]["value"] = $tmp[2]; $time_1 = strtotime($data[$row]["time_1"]); $time_2 = strtotime($data[$row]["time_2"]); //第1フィールド、第2フィールドの日付が2004/02/04以前であれば //その行の第三フィールドを表示するように指示しています。 if($time_1 < $time_base && $time_2 < $time_base){ print $data[$row]["value"]; }} ?> たぶん、これで動くと思います。 なんせ、CSVにはいっているその日付は文字列なので、それを一度変換する所がミソになるのではないかと。 お試しください。

hokuto-ken
質問者

補足

ありがとうございます。 厳密に説明しますと、 -----data.csv----------------- 2004/01/01@@@@@nnnnnn@@@@@**********@@@@@2005/04/01@@@@@aaaaaaaaaaaaaaaaaa 2004/01/03@@@@@nnnnnn@@@@@**********@@@@@2004/01/01@@@@@nnnnnnnnnnnnnnnnnn ・ ・ ------------------------------ CSVの区切りが「@@@@@」となっており、 第1フィールド、第4フィールドの日付が2004/02/04以前であれば その行全部のフィールどをファイルに書き出したいのですが、 上記例を参考に作成してみましたが、うまくできませんでした。 申し訳ございません。もう一度ご教授ください。

全文を見る
すると、全ての回答が全文表示されます。
noname#87667
noname#87667
回答No.1

data.txtとdata.csvの違いがよくわからないのですが、どこで躓いているのでしょうか?それを明記していただかないと答えようがありません。 ちなみに、新規ファイル作成はfopen関数をmode"a+"で実行してください。

hokuto-ken
質問者

補足

>data.txtとdata.csvの違いがよくわからないのですが、どこで躓いているのでしょうか?それを明記していただかないと答えようがありません。 申し訳ありません。 拡張子を間違えました。 data.txtとdata.csvは同一ファイルです。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 外部ファイル内の検索、表示方法

    初心者です。 どうしても分からないことがありますので、 質問させていただきます。 -----data.txt----------------- 2004/2/1,今日は2004年2月1日です。 2004/3/3,今日はひな祭りです。 ------------------------------ index.php、data.txtの2つのファイルを使用します。 PHPでdata.txtのファイル内を検索し、今日の日付とマッチ した場合は、「,」以下のコメントを表示したいと思っていますが、どのようなスクリプトになりますでしょうか? どなたか分かる方ご教授ください。 また、上記のようなスクリプトを公開しているサイト がありましたら、教えていただければと思います。

    • ベストアンサー
    • PHP
  • csvファイルについて

    javaで、csvファイルを読み取り、データベースにいれるツールを作成しています。 csvファイルを読み込む部分でつまづいてしまったので、どなたかご教授ください! 指定されたcsvファイルを一行ずつ取り込むのですが、一つの情報が2行以上になってしまうデータがいくつかあり、ファイルチェックとして、1つ目のカラムは何文字のものだとかしているけれども、その前の行の続きに当たる行が、その条件から外れてしまい、エラーになってしまいます。(当たり前ですが、、、) なぜ、csvファイルが一行に収まらないのかが、わかずですし、それを一行として読み込むことができるのかが不明で困っております。   原因や対処法が分かれば、教えていただければと思います。 よろしくお願いします。

  • ファイルを行ごとに比較するシェルスクリプトについて

    ファイルを行ごとに比較するシェルスクリプトをご教授ください。 例えば(master.txt)(a.txt)(b.txt)(c.txt)(ok.txt)(ng.txt)と4つのファイルがあり、 (master.txt)と(a.txt)の行を比較し(a.txt)の中のある行が(master.txt)の行と一致した場合(ok.txt)に (master.txt)の行と一致しなかった場合(ng.txt)に入れる。 その後(master.txt)と(b.txt)の比較し(a.txt)が使用したものと同じ(ok.txt)or(ng.txt)に入れる・・・ といったように繰り返していくシェルスクリプトはどのようにして作成するのでしょうか? txtファイルの中の行はランダムに入っており、x.txtの一行一行ををmaster.txtの全行と比較する必要があります。 自分で作ってみたものは、while文を2重で使い一行ずつ取り出しcase文で行が一致した物を(ok.txt)に入れる 所までは成功しているのですが、複数回繰り返す時にどのようなロジックで不一致行を(ng.txt)に入れる ことができるのかが考え付きませんでした。 よろしくお願いいたします。

  • 【FLASH】テキストファイルを一行ずつ表示させたい

    まだまだFLASH初心者のものです。 不可能な質問かもしれませんが、もしご存知の方がいらっしゃいましたら教えてください。 まず、私が実行したいことをいかに記載いたします。 ------------------------------------ 入力フォームより50文字程度のお知らせを投稿 ↓ ログファイル(log.txt)に一行ずつ投稿されたデータが記録される(最大10記録されます。) ↓ ログファイルのデータを一行ずつフラッシュで表示 (横に流れるニュースのようなかんじで) ------------------------------------ ログファイルの各行の最初に news1=書き込んだデータ1 &news2=書き込んだデータ2 というように変数を入れてあげれば、フラッシュで同じ変数を設定したテキストフィールドに反映させることはできるのですが、フォームから投稿したデータの場合、 書き込んだデータ1 書き込んだデータ2 と変数を頭につけることができません。 (フォームのスクリプト(php)で変数をつけて出力する方法も考えてみましたが常に最新の記事をnews1、ひとつ前の記事をnews2に変更して出力する方法がわからなかったので・・) もし、変数なしで一行ずつを表示させる方法をご存知の方がいらっしゃいましたら教えていただけますでしょうか。 また、ほかに良い方法がございましたらそちらも教えて頂ければと思います。

    • ベストアンサー
    • Flash
  • 二つのファイルから一行ずつ取り出して計算

    aaa.txt と bbb.txtというファイルがあり、それぞれ 1.1 0.1 -0.2 0.9 … といった感じで一行ずつ数値が入っています。 シェルスクリプトを用いて、 この二つのファイルから一行ずつ取り出して足し算を行いたい (例えばaaa.txtの一行目が1.1、bbb.txtの一行目が0.9なら1.1+0.9=2.0) のですが、どうすれば良いでしょうか。

  • ファイル内のキーを元に別のファイルをgrepする

    初めて質問させていただきます。 Perlを使って下記のことをじっそうしたいと思っています。 □テーブルから抽出したdata.csvの中に、外字文字コードが存在するか確認する。もし存在する場合は、その行を別のファイル(output.csv)へ出力する。 Perlで下記のような構造でプログラミングしたいと思っていますが、知識が乏しいため、どなたかサンプルコードをご提供いただけますでしょうか。 □外字文字コードをもつtest.txtを一行ずつ読み込み、そちらを検索キーとして、data.csv内をgrepし、該当行があったら、output.csvへ出力する。 test.txt \x40\xB0, \x41\xB1, \x43\xB2

  • 二つのファイルを読み込み、一つのファイルへ出力を行うプログラム

    初めて質問させていただきます。 専門学校にて以下のようなPerlの課題に取り組んでおります。初学者です。 ---------- 二つのファイルを読み込み、一つのファイルに出力を行う。但し、以下の条件で出力を行うこと。 (1)ファイルはすでにソートされているものとし、プログラム内でソートを行う必要はない。 (2)同じデータは一つしか出力しない。 ---------- 課題の意図としては、二つのファイルから一行ずつデータを読み込み、文字列比較をさせたのち、既出のもの(重複)は出力させない~みたいなことを求められています。 ---------- ■データ例 「A.txt(元データファイル)」 A00001 A00002 「B.txt(元データファイル)」 A00000 A00002 A00005 「C.txt(結果出力ファイル)」 A00000 A00001 A00005 ---------- まず、行き詰っているのは二つの元データファイルからデータを一行ずつ読み込み、比較する部分です。 関数で読み込ませ、if文で文字列比較するのはなんとなく分かるのですが、どう表現させてよいのかが、いまひとつ分かりません。 回答はじめ、ヒントとなる基本的な考え方を教えていただけると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイル内を検索してグラフを書く方法を教えてください。。。

    ここにdata.txtというファイルがあります。 中身はこのようになっています。 2005/12/01,0:44:55,7.3 2005/12/02,0:45:55,7.8 2005/12/03,0:46:55,7.8 2005/12/04,0:47:55,7.8 ・ ・ ちなみに,区切りで左側は日付、真ん中が時間、右側が温度になっています。 これは一行一行改行されています。 たとえばこのファイルの中から2005/12/01~2005/12/04というのをフォームで指定して各日にちに対応する温度を取り出します。 この取り出した温度をperlのGD::Graphモジュールを使って折れ線グラフ化したいのですが何かいい方法はありませんか??できればプログラムをお願いします。 またはこの形までもっていく方法もおねがいします。 @data=( ["2005/12/01","2005/12/02","2005/12/03","2005/12/04"], [7.3,7.8,7.8,7.8] ); です。上の[]が,区切りの日付、下の[]が温度です。必ずしも4日とは限らないのでそこをおねがいします。

    • ベストアンサー
    • Perl
  • ファイルメーカー5でフィールドをインポートしたい

    エクセルで作った50個くらいのフィールドをファイルメーカー5に取り込みたいのですが、どのようにすればよいでしょうか?エクセルで作ったフェールドとはCSVファイル形式で保存して、一行目に日付、種別などのフィールドがあり、その下にデータが600くらいあるデータです。

  • 外部のCSVファイルをPHPで読み込み、出力させたい

    下記の質問を参考に外部のCSVファイルをPHPで読み込み、出力させるphpを書きました。 http://oshiete1.goo.ne.jp/qa1615206.html data.csvは "データ01" "データ02" "データ03" ・・・ といったように100行書いてあります。 <1ページ目に記述したphp> <?php $fp = fopen("data.csv", "r"); $repeat = 10; $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0] EOD; $count++ ; } fclose ($fp) ?> 2ページ目には11行目からのデータを出力したいと思い、 $data[0]の部分を$data[11]に変えたり、 $repeat = 20; $count = 11;にしたりしたのですが、 両方ともうまくいきませんでした。 2ページ目にcsvの11行目からのデータを出力するにはどうすればいいのでしょうか? 私がしたいことは、1ページ目にcsvの1~10行目を、2ページ目にcsvの11~20行目を出力したいとおもっております。 上記のphp以外の記述でも構いませんので、どなたかお分かりになる方がいらっしゃいましたら是非教えて下さい。 よろしくお願い致します。

    • ベストアンサー
    • PHP