PHP入門 ファイルシステム関数 タブ区切りテキストの読み込み(fgetcsv関数)

fgetcsv関数は、タブ区切りテキストやカンマ区切りテキストなど、定型フォーマットのテキストを読み込む場合に便利な関数です。fgetcsv関数は、特定の区切り文字を持ったテキストに汎用的に対応する関数です。

構文:fgetcsv関数

fgetcsv(resource $stream [, int $length [, string $separator = ","
         [, string $enclosure = '"' [, string $escape = "\\"]]]]):array
$streamファイルハンドル
$length読み込む最大長(バイト単位)
$separator区切り文字(既定ではカンマ)
$enclosureフィールドの囲み文字(既定ではダブルクォート)
$escapeエスケープ文字(既定ではバックスラッシュ)

fgetcsv関数は、ファイルポインターを1行ずつ後ろにずらしながら、現在行のテキストを読み込み、指定された区切り文字で分割した値を配列として返します。ファイルポインターとは、ファイルを現在読み書きしている位置を示す目印のようなものです。ファイルシステム関数では、このファイルポインターを利用することで、自分が今ファイルのどの部分を読み書きしているか記憶しておくことができます。ファイルポインターはファイルを開いた直後の状態では、ファイルの先頭に位置しています。

fgetcsv関数は、読み込むべき次の行が存在しない場合は、falseを返します。fgetcsv関数のこの性質を利用して、fgetcsv関数がfalseを返しますまでwhileループを繰り返すことで、ファイル内のすべての行を読み込んでいます。fgetcsv関数の戻り値は配列なので、それぞれの列にはforeach命令でアクセスできます。

例:タブ区切りテキストの読み込み

<body>
    <table class="table">
    <thead>
    <tr>
      <th>アクセス日時</th> 
      <th>スクリプト名</th>
      <th>ユーザーエージェント</th>
    </tr>
    </thead>
  <tbody>

<?php
// ファイルを読み取り専用でオープン
$file = fopen('access.log', 'r');
// ファイルを共有ロック
flock ($file, LOCK_SH);
// 行単位でテキストを読み込み&タブ文字で分割
while ($line = fgetcsv($file, 1024, "\t")) {
  print '<tr>';
// 分割した結果を順に出力
  foreach ($line as $value) {
    print '<td>' . $value. '</td>';
  }
  print '</tr>';
}
// ロックの解除
flock ($file, LOCK_UN);
// ファイルをクローズ
fclose($file);
?>
  </tbody>
</table>
</body>
実行結果
実行結果