phpその1(DEC) > phpその2(DEC)> php10days

10ファイルの操作№01→ > №01 > №02 > №03 > №04 > №05 > №06 > №07 BT > №00 > END

10 ファイルの操作  (№1)

テキストファイルを読み込み、各種作業を行ないます。

●10.1ファイルの読込 file( ) p48

●|||準備|||

以下のデータを入力し「name_list.txt」の名前で保存しょう。
阿部
伊東
桜井
高橋
西田

○//操作//

file( )関数を利用し、「name_list.txt」を読み込み、表示させます。
ファイルをinput001.phpの名前で保存します。
<?php
$moji = file('name_list.txt');
print_r($moji);
?>

input001.php
input001.php.html(ソース)

<練習>

input001.phpをtableを使って各行を見やすくするように表示させ、input002.phpの名前で保存しょう。
ヒント:読み込んだファイルは、行ごとに配列要素として扱われているので、foreachを利用し、効率よくtableを組むことができます。
input002.php
input002.php.html(ソース)


【<エラーの回避 @ or>】 ※ファイルを読み込む命令を行なう際、「その」ファイルが存在していない時にエラーが表示されてしまいます。
エラーメッセージを表示させるのは都合が悪いので @~orを使いエラー発生時の処理を指定します。

○//操作//○

以下のソースを記述し、無いファイルを読み込もうとした時には正しいメッセージが表示される様子を確認しましょう。input003.phpの名前で保存しましょう。
<?php
@file('name_list_22.txt') or exit('ファイルが見つかりませんでした');
print_r($moji);
?>

input003.php
input003.php.html(ソース)

<練習>

改めて「name_list_2.txt」に下記データを保存し、tableで整形させ表示させましょう。
input004.phpの名前で保存しましょう。
阿部,65,59,78
伊東,88,76,49
桜井,98,90,100
高橋,40,78,20
西田,31,20,16


input004.php
input004.php.html(ソース)


【<trim( ) 改行コード、空白、タブを取り除く>】

※input002.phpのソースを表示させると、少し見にくいことになっているはずです。
これは、もとデータにある改行コードがそのままであるためです。
readfileでファイルを読み込むだけでは、「改行コード」「タブ」「空白」がそのまま残った状態なので、不必要なものを取り除きます。

○//操作//○

input002.phpを書換え余分な「改行」「空白」「タブ」を削除させます。
trim001.phpの名前で保存しましょう
必要に応じて改行コード 「\n」も入れて整えます。

<?php
$moji = file('name_list.txt');
echo "<table border='1'>\n";
foreach($moji as $dt){
echo "<tr><td>" .trim($dt). "</td></tr>\n";
}

trim001.php
trim001.php.html(ソース)

●10.2順次、ファイルからテキストを読み込む p51

ファイルを一行ずつ読み込みながら処理する方法が、より一般的な作業となります。 各種関数を利用し、一行ずつ読み込ませながら整形し表示する手順を身につけましょう。

■$変数=fopen(パス,モード); ファイルを開く
《fopenで使用するモード》
r ⇒読み込みのみ
r+⇒読み書き可能
w ⇒書き込みのみ、ファイルが無ければ新規作成
w+⇒読み書き可能、ファイルが無ければ新規作成
a ⇒追加書き込み
a+⇒追加書き込み・読み込み
x ⇒書き込みのみ、ファイルがあればfopen( )は失敗、無ければ新規作成
x+⇒読み書き可能、ファイルがあればfopen( )は失敗、無ければ新規作成
■変数=feof($変数); ファイルの終わりかどうか(End Of File)
■変数=fgets($変数); ファイルから一行テキストを読み込む、
行末には改行コードが含まれる
■変数=fclose($変数); 処理が終わったらファイルを閉じる

○//操作//○

以下のソースを記述し、表示を確認しましょう。fopen001.phpの名前で保存しましょう。

<body>
<h1>fopen001.php</h1>
fopenを利用して、一行ごとに読み込み<br />
<?php
$fname = 'name_list_2.txt';
$data1 = @fopen($fname,'r') or exit('ファイルが見つかりませんでした</body></html>');
echo "<table border=\"1\">";
while(!feof($data1)){//eof状態でなければループ
echo "<tr><td>".fgets($data1). "</td></tr>";
}
echo "</table>";
fclose($data1);
?>
</body>
fopen001.php
fopen001.php.html(ソース)

<練習>

trim( )を利用し、見やすいソースが書き出されるよう調整しましょう
fopen002.phpの名前でほぞんしましょう


fopen002.php
fopen002.php.html(ソース)


■strtk( )でカンマごとに分割

タブなどの区切り記号(トークン)ごとに分割させる関数を使用し、タブ区切りごとにデータをしょりします。

■ $ 変数 = Strtok(文字列,分割文字);
--例、カンマで区切る場合--
strtok($data,",");
--例、タブで区切る場合--
strtok($data,"\t");
「文字列」を「分割文字」ごとに区切る
2回目以降は文字を指定しない

《特殊な分割文字》
タブ⇒\t

作業の流れ

|||操作|||

以下のソースを入力し fopen003.phpの名前で保存し動作を確認しましょう。

<?php
$fname = 'name_list_2.txt';
$data1 = @fopen($fname,'r') or exit('ファイルが見つかりませんでした</body></html>');
echo "<table border=\"1\" cellpadding=\"5\">\n";

while(!feof($data1)){ //eof状態でなければループ
$string = trim(fgets($data1));//開いたファイルから空白削除しつつ一行取得
$dt = strtok($string,','); //一行をカンマをトークンとして切出し
echo "<tr>\n";
while($dt){ //$dtが空でなければループ
echo "<td>".$dt. "</td>\n";
$dt = strtok(",");
}

echo "</tr>\n";
}
echo "</table>";
fclose($data1);
?>

fopen003.php
fopen003.php.html(ソース)

練習

タブ区切り(\t)のデータを作り、タブごとに切出されるように処理しましょう。

yasai.php
yasai.php.html(ソース)

■csv形式専用 fgetcsv( )

カンマで区切られたデータを処理することは、かなり頻雑に行なわれるので、専用の関数が用意されています。
読み込まれたテキストは、カンマごとに配列にまとめて返されます。

■ $ 配列 = fgetcsv($変数,最大サイズ); 「$変数」をタブごとに区切り、配列に格納する

|||操作|||

以前作成した「name_list_2」をfgetcsv( )を利用し、タブごとに配列に格納されたデータを処理します。
fgetcsv001.phpのファイル名で保存し、動作を確認しましょう。。

<?php
$fname = 'name_list_2.txt';
$data1 = @fopen($fname,'r') or exit('ファイルが見つかりませんでした</body></html>');
echo "<table border=\"1\" cellpadding=\"5\">\n";
while(!feof($data1)){ //eofじゃなければループ
$string = fgetcsv($data1);//開いたファイルから一行取得し配列へ格納
echo "<tr>\n";
foreach($string as $dt){ //$dtが空でなければループ
echo "<td>".$dt. "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
fclose($data1);
?>

fgetcsv001.php
fgetcsv001.php.html(ソース)

練習

右端に合計蘭を作り、3つの数字の合計を出力させましょう。
fgetcsv002.phpのファイル名で保存し、動作を確認しましょう。

fgetcsv002.php
fgetcsv002.php.html(ソース)

練習

以下のデータをカンマで区切りで作成し、「flight_time_9.csv」の名前で保存し、
表として表示されるようなスクリプトを作成しましょう。flight_time.002_9.phpの名前で保存しましょう。

flight_time002_9.php
flight_time002_9.php.html(ソース)

●●

○○○○○○○○○○○○○○

flight_time002_10.php[リンク付]
flight_time002_10.php.html(ソース)

●●

○○○○○○○○○○○○○○

flight_time002_99.php
flight_time002_99.php.html(ソース)