1. CSV

CSV 파일은 엑셀등 데이터베이스의 자료들을 서로 주고 받을 때 자주 사용하는 순수 데이터 포맷 파일의 일종입니다. CSV는 데이터를 외부 파일로 출력하고, 외부 데이터를 일괄처리하여 입력 받을 때 많이 사용을 합니다.

07.1 샘플데이터

엑셀 프로그램등을 통하여 작성한 데이터를 CVS 포멧으로 저장을 하면 됩니다. 파일 저장형식을 선택하면 다양한 파일 형식을 선택할 수 있습니다.

CSV 파일로 엑셀파일을 저장을 각각의 데이터는 콤마(,)로 구분하여 한 줄에 한개의 레코드 데이터를 저장합니다.

07.2 CSV 쓰기

PHP에서 생성한 데이터를 CSV 형태의 파일로 출력할 수 있습니다. 출력된 CSV 파일은 엑셀등의 응용프로그램에서 읽고, 데이터를 가공할 수 있습니다.

fputcsv() 함수는 입력된 Array 배열을 CSV 형식으로 줄을 만들고 파일 포인터에 씁니다.

|내부함수| int fputcsv ( resource $handle , array $fields [, string $delimiter = “,” [, string $enclosure = ‘”’ [, string $escape_char = “" ]]] )

fputcsv ()는 필드 배열로 전달 된 행을 CSV로 형식으로 지정합니다. 지정된 파일 핸들에 새 행으로 끝내도록 출력합니다.

예제) csv_write.php <?php

$list = array (
	array(1, "aaa", 18, "Seoul"),
	array(2, "bbb", 20, "Daejeon"),
	array(3, "ccc", 30, "Incheon ")
);

$csvFile = "sample.csv";

$fp = fopen($csvFile, 'w');
if (!is_resource($fp)) {
	die("저장할 파일 포인터를 생성할 수 없습니다.");
} else {

	// 파일 독점 잠금 설정
	flock($fp,LOCK_EX);

	// 배열을 CSV 파일로 저장
	foreach ($list as $fields) {
			fputcsv($fp, $fields);
	}

	// 파일잠금 해제
	fflush($fp);
	flock($fp,LOCK_UN);
	
	fclose($fp);
}

?>

지정한 Array 데이터를 sample.csv 파일로 출력을 합니다.

파일내용) 1,aaa,18,Seoul 2,bbb,20,Daejeon 3,ccc,30,”Incheon “

07.3 CSV 읽기

PHP는 CVS 파일의 데이터를 쉽게 읽고 처리하기 위해서 fgetcsv() 함수를 제공합니다. fgetcsv() 함수는 파일 포인터에서 한 줄 단위로 데이터를 읽어와 $delimiter 기호를 기준으로 CSV 필드를 구문 분석합니다.

|내부함수| array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = “,” [, string $enclosure = ‘”’ [, string $escape = “" ]]]] )

fgetcsv()가 CSV 형식의 필드에 대해 읽은 행을 구문 분석하고 읽은 필드가 들어있습니다. 배열을 반환한다는 점을 제외하면 fgets()와 비슷한 동작을 수행합니다.

예제) csv_read.php.php <?php $csvFile = “sample.csv”;

// 먼저 CSV 파일 존재 유무를 확인합니다.
if(!file_exists($csvFile)){
	die("CVS 파일이 존재하지 않습니다.");
} else {

	// CSV 파일을 읽어옵니다.
	$row = 1;
	if (($fp = fopen($csvFile, "r")) !== FALSE) {
		// CSV 데이터 한줄을 읽어 옵니다.
		$length = 1000;
		$delimiter = ",";
			while (($data = fgetcsv($fp, $length, $delimiter)) !== FALSE) {
    				$colums = count($data);

    				echo "라인($row): 컬럼수($colums)<br/>";
    				$row++;
    				for ($i=0; $i < $colums; $i++) {
        				echo $data[$i] . "<br />";
    				}
			}
			fclose($fp);
	}

}

?>

화면출력) 라인(1): 컬럼수(4) 1 aaa 18 Seoul 라인(2): 컬럼수(4) 2 bbb 20 Daejeon 라인(3): 컬럼수(4) 3 ccc 30 Incheon

|내부함수| array str_getcsv ( string $input [, string $delimiter = “,” [, string $enclosure = ‘”’ [, string $escape = “\” ]]] )

내부함수 str_getcsv()는 CSV 문자열을 배열로 구문 분석합니다.

예제) str_getcsv.php <?php

$csv = array_map('str_getcsv', file('sample.csv'));
print_r($csv); ?> 

화면출력) Array ( [0] => Array ( [0] => 1 [1] => aaa [2] => 18 [3] => Seoul ) [1] => Array ( [0] => 2 [1] => bbb [2] => 20 [3] => Daejeon ) [2] => Array ( [0] => 3 [1] => ccc [2] => 30 [3] => Incheon ) )