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

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

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

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

●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(ソース)