webdata
DX推進をサポートする技術者向け情報提供サイト

技術者向け技術情報

TOP >技術者向け技術情報 > CSVファイルの読み込み書き込み

【PHP】CSVファイルの読み込み書き込み

 2022-07-17 (更新日:2022-07-17)
 この処理は大して難しいわけでではありません。このプログラムを行うことは、CSVよりデータを読み込んで
DBに書き込みを行うことです。読み込みするCSVの列数が多くなると同じようなプログラムが増えて煩雑になる
ので配列を使って簡素化を図った利用例です。

■CSV読み込み方法

<CSV読み込みサンプルプログラム> read_csv.php
<?php

//CSVファイルを読み込んでDBの対象テーブルへinsertする例

	///DB接続
	$conn = mysqli_connect();		//パラメータを記載のこと

	$path = '/CSVファイルの保存先/';
	$fileName = '対象ファイル名.csv';
	$path_file = $path.$fileName;

	$i = 0;						//読み込んだファイルの行数をカウント
	$n = 35;					//CSVファイルの列数を記載(35は記載例)
	$f = fopen("$path_file", "r");
	while($data = fgetcsv($f)){
		if($i > 0){				//1行目は読み込まない。(項目名を外すため)
			$data = mb_convert_encoding($data, 'UTF-8', 'sjis-win'); //Windowsのファイルならこのように文字コード変換
			for($c = 0; $c < $n; $c++){
				if(empty($data[$c])){
					$data[$c] = 'null';		//データがないときはnullを登録
				}else{
					$data[$c] = mysqli_real_escape_string($conn,$data[$c]);	//$connはmysqliに接続するコマンドを代入したもの
				}
				if($c == 0){
					$inscolumn = 'data0';
					$insData = $data[0];
				}else{
					$inscolumn = $inscolumn.',data'.;
					$insData = $insData.", ".$data[$c];
				}
			}
			//DBへの書き込み(テーブルのカラム名は、data0からの連番としている。)
			$sql = "insert into 対象テーブル
						(
							$inscolumn
						) values (
							$insData
						)
						;";
			mysqli_query($conn,$sql) or die("err1 $sql");
		}
		$i++;
	}
	fclose($f);

?>
						

■CSV書き込み方法

<CSV書き込みサンプルプログラム> write_csv.php
<?php

//DBの得意先マスターテーブルを書き出す例

	//DB接続
	$conn = mysqli_connect();		//パラメータを記載のこと

	//ファイルの初期化(ファイル削除)
	$fileName = "対象ファイル名.csv";
	if(file_exists($filename)){
		unlink($filename) or die('ファイル削除に失敗');
	}
	//書き出す項目名の指定カンマ・改行キー追加、文字コード変換
	$i = mb_convert_encoding('項', 'sjis-win', 'UTF-8').",";
	$tokuiCode = mb_convert_encoding('得意先コード', 'sjis-win', 'UTF-8').",";
	$tokuiName = mb_convert_encoding('得意先名', 'sjis-win', 'UTF-8').",";
	$address = mb_convert_encoding('住所', 'sjis-win', 'UTF-8')."¥n";

	//csvファイルへの項目の書き出し
	$file = fopen($filename, "a") or die("OPENエラー $filename");
	flock($file, LOCK_EX);
	fputs($file, $i.$tokuiCode.$tokuiName.$address);
	flock($file, LOCK_UN);
	fclose($file);

	//データの抽出
	$sql = "select 得意先コード,得意先名,住所 from 得意先マスター;";
	$res = mysqli_query($conn,$sql) or die("err $sql");
	while($row = mysqli_fetch_array($res){
		$tokuiCode = $row["得意先コード"];
		$tokuiName = $row["得意先名"];
		$address = $row["住所"];

		//書き出すデータの代入とカンマ・改行キー追加、文字コード変換
		$ii = $i.",";
		$tokuiCode = mb_convert_encoding($tokuiCode , 'sjis-win', 'UTF-8').",";
		$tokuiName = mb_convert_encoding($tokuiName 'sjis-win', 'UTF-8').",";
		$address = mb_convert_encoding($address, 'sjis-win', 'UTF-8')."¥n";

		//csvファイルへのデータの書き出し
		$file = fopen($filename, "a") or die("OPENエラー $filename");
		flock($file, LOCK_EX);
		fputs($file, $ii.$tokuiCode.$tokuiName.$address);
		flock($file, LOCK_UN);
		fclose($file);

		$i++;
	}
?>
						
<解説>
  書き出すファイル名にパスが無いと、書き込みプログラムと同じフォルダーに保存されます。
  ※注意事項として
   ファイルを書き出すフォルダーのパーミッションは環境に合わせて設定して下さい。例)664とか
   40行目のfputs($file, $ii.$tokuiCode.$tokuiName.$address); ですが、
   $ii を $i のままにするケースがあります。この際CSVへの書き出しは1列ずつずれてしまいます。