下記の方法について説明します。
- CSVファイルの読み込み
- CSVの中身のデータである列,行の取得方法、及びデータの書き換え
- CSVファイルの出力
ソースコード
CSVファイルを読み込み、CSVファイルを出力するまでのソースコードはこの様になります。
$reader = new SplFileObject('read.csv','r'); //r=read(読み込み) $reader->setFlags(SplFileObject::READ_CSV); $writer = new SplFileObject('write.csv', 'w'); //r=write(書き込み) foreach($reader as $reader_line => $reader_columns) { //CSVファイル1行目の場合 if($reader_line === 0){ $writer_columns = [ $reader_columns[0].'0列目',$reader_columns[1].'1列目', $reader_columns[2].'2列目', ]; //CSVファイル1行目以外の場合 }else{$csv_line = $reader_line + 1; $writer_columns = [ $reader_columns[0].'です。'.$csv_line .'行目のデータです。', $reader_columns[1].'です。'.$csv_line .'行目のデータです。', $reader_columns[2].'です。'.$csv_line .'行目のデータです。', ]; }//foreach 1回ごとに1行分のデータ($writer_columns)を出力 $writer->fputcsv($writer_columns); }
CSVファイルの読み込み
$reader = new SplFileObject('read.csv','r'); //r=read(読み込み) $reader->setFlags(SplFileObject::READ_CSV);
SplFileObjectクラスの、setFlagsメソッドを使用しファイルを読み込んでいます。
これにより$readerにCSVのデータが入ります。
CSVの「列,行のデータ取得方法」と「データの書き換え」
foreach($reader as $reader_line => $reader_columns) { //CSVファイル1行目の場合 if($reader_line === 0){ $writer_columns = [ $reader_columns[0].'0列目',$reader_columns[1].'1列目', $reader_columns[2].'2列目', ]; //CSVファイル1行目以外の場合 }else{$csv_line = $reader_line + 1; $writer_columns = [ $reader_columns[0].'です。'.$csv_line .'行目のデータです。', $reader_columns[1].'です。'.$csv_line .'行目のデータです。', $reader_columns[2].'です。'.$csv_line .'行目のデータです。', ]; } //foreach 1回ごとに1行分のデータ($writer_columns)を出力 }
foreach文でデータを取り出しています。
$reader_line === 0の時、CSVファイルの1行目のデータを取得しています。
foreach文で1行読み込む度に、データを「1列目〜最後の列まで($reader_columns)」配列で取得します。
上記のコードでやっていることはシンプルで、$reader_columns(1行分のデータ)を$writer_columnsに代入して出力しています。
$writer_columns =$reader_columns; にした場合、元々のCSVファイルと同じ内容が出力されるようになるはずです。
CSVファイルの出力
$writer = new SplFileObject('write.csv', 'w'); //r=write(書き込み)//foreach 1回ごとに1行分のデータ($writer_columns)を出力 $writer->fputcsv($writer_columns);
読み込みファイルと同じ様に、SplFileObjectクラスをインスタンス化しますが、今回は書き込み用として作成します。
SplFileObjectクラスのfputcsv()を活用して$writer_columnsを出力させれば、新たに内容が書き換えられたCSVファイルが出来ます。
注意点ですが、new SplFileObjectをforeach文の中に記述してしまうとforeachの配列の数だけSplFileObjectクラスがインスタンス化されてしまいますので、ご注意ください。
参考(出力後のファイル・ディレクトリ)
ディレクトリ構造

実行後のディレクトリ構造はこのようになっています。ターミナルでphp index.phpみたいに実行すれば使えます。
read.csv

write.csv

コメント