[BACK][HOME][NEXT]

CSVの読み書き

CSVファイルの準備

まず、以下の内容を持つテキストファイルを作り、「test.csv」という名前で、phpファイルと同じフォルダに保存しましょう。

名前,身長(cm),体重(kg),血液型
斉藤一郎,170,60,A
鈴木二郎,180,90,B
田中三郎,190,80,O
中村四郎,160,100,AB

CSVファイルを開く

CSVファイルを開くために以下の関数を使います。

fopen( ファイル名, モード )

モードには8種類ありますが、'r'と'w'と'a'が代表的でしょう。

CSVファイルの中身を表示する

CSVファイルの中身を表示する例を挙げます。

<?php
if( $handle = fopen( 'test.csv', 'r' ) ){
        echo '<table border=1>';
        while( ( $lines = fgetcsv( $handle ) ) !== FALSE ){
                echo '<tr>';
                for( $i = 0; $i < count( $lines ); $i ++ ){
                        echo '<td>' . $lines[$i] . '</td>';
                }
                echo '</tr>';
        }
        echo '</table>';
}
?> 

以下のようにテーブルのHTMLが表示されます。

名前 身長(cm) 体重(kg) 血液型
斉藤一郎 170 60 A
鈴木二郎 180 90 B
田中三郎 190 80 O
中村四郎 160 100 AB

CSVファイルの末尾に新しいデータを追加する

「test.csv」の末尾に、「山田五郎,300,300,S」を追加します。

if( $handle = fopen( 'test.csv', 'a' ) ){
        fputcsv( $handle, Array('山田五郎','300','300','S') );
}

もしも、「中村四郎」の行の最後が改行されていないと、この行に「山田五郎」が追加されてしまうので注意。

CSVで簡単な検索をする

CSVファイルから体重が90以上の人を探します。

<?php
if( $handle = fopen( 'test.csv', 'r' ) ){
        $names = Array();  //該当者の名前を保存する配列
        while( ( $lines = fgetcsv( $handle ) ) !== FALSE ){
                if( $lines[2] >= 90 ){  //体重が90以上なら
                        $names[] = $lines[0];  //名前を追加
                }
        }
        echo '体重が90kg以上なのは、' . implode( '・', $names ) . 'です';
}
?>

CSVファイルを特定の項目で並び替える

CSVファイルを身長が低い順に並び替えます。CSVファイル自身が更新されます。

<?php
$lines = file( 'test.csv' );     //ファイルの各行を配列に代入

$head = array_shift( $lines );   //先頭のラベルを取り出す
usort( $lines, 'cmp' );          //並び替える
array_unshift( $lines, $head );  //先頭にラベルを戻す

if( $handle = fopen( 'test.csv', 'w' ) ){
        foreach( $lines as $line ){  //ファイルに書き出す
                fwrite( $handle, $line );
        }
}

function cmp( $a, $b ){
    $aa = explode( ',', $a );
    $bb = explode( ',', $b );
    if( $aa[1] == $bb[1] ){ return 0; }
    if( $aa[1] < $bb[1] ){ return -1; }
    return 1;
}
?> 

身長が高い順にするには、cmp関数の「<」を「>」に変えます。

[BACK][HOME][NEXT]