php ver5


ファイルを読み込み、各変数にデータをセットするスクリプトを作成して下さい。

ファイル構成:
type|title|joblist|year|education|graduate

私が考えている方法は、各データの区切りを>$ $<で行い、次のデータへの区切りは2つの改行で行うという物です。ちなみにjoblistはデータ内に1つの改行は入ります。

質問文が長くなりましたので、 http://d.hatena.ne.jp/esecua/20090730 をご覧下さい。

回答の条件
  • 1人5回まで
  • 登録:2009/07/30 12:18:15
  • 終了:2009/08/06 12:20:03

回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/07/30 15:10:05

ポイント35pt

コメントにて追加情報をありがとうございます。

"data.txt" のフィールド(変数)の並びが正しいものとしてスクリプトを組んでみました。

変数に読み込む方が HogeHogeクラス、処理する方がHogeProcクラスです。

<?php
//data.txtから変数に読み込むためのクラス
class HogeHoge {
    private $var_tbl = array('type', 'title', 'joblist', 'education', 'year', 'graduate');    //変数の名前(順番はdata.txtに合わせてください)

    //レコードを1つだけ読み込む
    function fread_hoge($infp) {
        $flag = TRUE;
        $key = 0;
        $ln  = 1;
        $str = '';
        while ($flag) {
            if (($instr = fgets($infp)) == FALSE)   $flag = FALSE;
            $instr = trim($instr);
            switch ($instr) {
                case '';                //レコードの終わり
                    $flag = FALSE;
                    break;
                case '>$':              //フィールドの始まり
                    $str = '';
                    $ln = 1;
                    break;
                case '$<':              //フィールドの終わり
                    $this->{$this->var_tbl[$key]} = $str;
                    $key++;
                    break;
                default:                //データの実体
                    if ($ln > 1)    $str .= "\n";
                    $str .= $instr;
                    $ln++;
                    break;
            }
        }
    }
}

//オブジェクトの変数を表示するだけのクラス
class HogeProc {
    function fwrite_hoge($hoge) {
        $var_tbl = array('type', 'title', 'joblist', 'education', 'year', 'graduate');
        foreach ($var_tbl as $val) {
            echo $val . '=' . $hoge->{$val} . "\n";
        }
        echo "=====================================\n";
    }
}

// メインプログラム =========================================================
$hoge = new HogeHoge();
$hogep = new HogeProc();

$infname = 'data.txt';
$infp = fopen($infname, 'r');

while (! feof($infp)) {
    $hoge->fread_hoge($infp);
    $hogep->fwrite_hoge($hoge);
}
fclose ($infp);
?>
id:esecua

回答有り難うございます。

サーバに置いてある data.txt を読み込むのではなく、ブラウザからファイルをアップロードし、それを読み込むタイプを御願いします。

2009/07/30 19:46:50
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332009/07/30 21:44:43

ポイント35pt

サーバに置いてある data.txt を読み込むのではなく、ブラウザからファイルをアップロードし、それを読み込むタイプを御願いします。

はいはい。

下記のスクリプトを UTF-8 で保存してください。

'data.txt' のエンコードは $UploadEncoding に記述してください。

エラー処理はほとんど行っていません。とくに、アップロード・ファイルの構造が異常だと、何が起きるか分かりません。

<?php
//エンコード関係
$InternalEncoding = 'UTF-8';
$UploadEncoding = 'auto';       //アップロードファイルのエンコードを記入
mb_internal_encoding($InternalEncoding);
$MySelf = basename($_SERVER['SCRIPT_NAME']);

//data.txtから変数に読み込むためのクラス
class HogeHoge {
    private $var_tbl = array('type', 'title', 'joblist', 'education', 'year', 'graduate');

    //レコードを1つだけ読み込む
    function fread_hoge($infp) {
        global $InternalEncoding, $UploadEncoding;

        $flag = TRUE;
        $key = 0;
        $ln  = 1;
        $str = '';
        while ($flag) {
            if (($instr = fgets($infp)) == FALSE)   $flag = FALSE;
            $instr = trim($instr);
            $instr = mb_convert_encoding($instr, $InternalEncoding, $UploadEncoding);
            switch ($instr) {
                case '';                //レコードの終わり
                    $flag = FALSE;
                    break;
                case '>$':              //フィールドの始まり
                    $str = '';
                    $ln = 1;
                    break;
                case '$<':              //フィールドの終わり
                    $this->{$this->var_tbl[$key]} = $str;
                    $key++;
                    break;
                default:                //データの実体
                    if ($ln > 1)    $str .= "\n";
                    $str .= $instr;
                    $ln++;
                    break;
            }
        }
    }
}

//オブジェクトの変数を表示するだけのクラス
class HogeProc {
    function fwrite_hoge($hoge) {
        $var_tbl = array('type', 'title', 'joblist', 'education', 'year', 'graduate');
        $outstr = '';
        foreach ($var_tbl as $val) {
            $outstr .= $val . ' = ' . $hoge->{$val} . "<br />\n";
        }
        $outstr .= "=====================================<br />\n";
        return $outstr;
    }
}

// メイン・プログラム =======================================================
$html_header =<<< EOD
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset={$InternalEncoding}" />
</head>

EOD;
$html_footer = <<< EOD
</html>

EOD;

//アップロード
if (! isset($_POST['exec'])) {
    $html_body =<<< EOD
<body>
<h2>■データ・アップロード</h2>
<form enctype="multipart/form-data" method="post" action="{$MySelf}">
<table border="0" cellspacing="5">
<tr>
<td>アップロード・ファイル</td>
<td><input name="upload" type="file" size="80" /></td>
</tr>
<tr>
<td> </td>
<td>
<input name="exec" type="submit" value="送信" />
</td>
</tr>
</table>
</form>

EOD;
//変数代入&表示処理
} else {
    $hoge  = new HogeHoge();
    $hogep = new HogeProc();
    $infp = fopen($_FILES['upload']['tmp_name'], 'r');
    $html_body = '';
    while (! feof($infp)) {
        $hoge->fread_hoge($infp);
        $html_body .= $hogep->fwrite_hoge($hoge);
    }
    fclose($infp);
}

// 表示処理 ===============================================================
echo $html_header;
echo $html_body;
echo $html_footer;
?>
id:esecua

ほんとにすいません。。。

XMLの件、よろしくおねがいします。

2009/07/30 23:34:41
  • id:pahoo
    "year|education|graduate" の並びは本当にこの通りですか?
    "data.txt" と結果を見ると、year と education の順序が逆のように見えます。
    常に順序が逆なら対応できますが、この点をご確認ください。
  • id:esecua
    >year と education の順序が逆のように見えます。

    仰るとおりです。

    失礼しました。
  • id:standard_one
    >私が考えている方法は

    ということは現時点ではデータもプログラムも存在せず、もっと簡単な方法があればそっちでも構わないということでしょうか?
  • id:esecua
    >ということは現時点ではデータもプログラムも存在せず、もっと簡単な方法があればそっちでも構わないということでしょうか?

    プログラムは存在します。
    <input type="text">
    でブラウザからデータを入力させ、それを何度も行うという方法です。


    それよりも一気にノートパッドなので書き出し、それをPHPで処理する方法が簡単だと判断したからです。
  • id:pahoo
    書き忘れましたが、回答したスクリプトにある変数は連想配列ではなく可変変数を用いていますので、メインプログラムから $hoge->joblist のようにして参照できます。

    あと、いただいた 'data.txt' の構造はとても難しいです。
    XML構造にしてもらえれば、スクリプトはもっと簡単になります。
  • id:esecua
    >XML構造にしてもらえれば、スクリプトはもっと簡単になります。

    おぉ、XMLは全く考えませんでした。
    よろしければ詳しく教えていただけませんか?
  • id:pahoo
    "data.txt" がどういう手順/文法で生成されるか分かりませんし、それに関わるプログラムは存在しているとのことなので、その当たりの状況を詳しくお伺いしないと、XML化の方法をアドバイスすることはできません。悪しからず。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません