프로그래밍/PHP

csv 파일 생성하기

kugancity 2021. 4. 20. 19:03
반응형

 

 

 

fputcsv는 mysql에서 select로 읽어 온 데이터들을

csv로 저장할 때 사용할 수 있는 함수이다. 

 

함수 정의는 아래와 같다. 

행은 $fields 배열로 전달되고 지정된 파일 $handle을 사용한다. 

 

$delimiter 는 필드 분리 문자로 기본적으로 ,가 사용되고 한 문자만 사용 가능하다. 

$enclosure는 기본적으로 "가 사용하고 역시 한 문자만 사용 가능하다. 

$escape_char는 이스케이스 문자로 최대 한 문자만 사용 가능하다. 

 

개행으로 종료된다. 

 

반환 값으로는 쓰여진 문자열의 길이를 반환하거나 실패할 경우 false를 반환한다. 

 

fputcsv ( resource $handle , array $fields , string $delimiter = "," , 
          string $enclosure = '"' , string $escape_char = "\\" ) : int|false

 

mysql query를 배열로 읽어온 후 

칼럼 내용을 저장하고 각 배열 원소당 지정된 파일에 csv 형태로 저장한다. 

예시에서는 탭문자를 구분자로 사용하였다. 

이 때 주의해야할 것이 개행/탭 문자 등은 ""로 감싸야한다. 

 


    try
    {
        $mysql->setPreparedStatement($query, $types, $param);
        $data = $mysql->getPreparedStatementArray();
    }
    catch (Exception $e)
    {
        exitWithMsg(3801, $e);
    }


    if($data)
    {
        $fp = fopen($filename, 'w');
        #fputs($fp, $bom =( chr(0xEF) . chr(0xBB) . chr(0xBF) )); // UTF-8 file for excel
        fputs($fp, $colname);
        foreach($data as $val)
        {
            fputcsv($fp, $val, "\t");
            // fputcsv($fp, preg_replace('/[\r\n]/', ' ',$val), "\t"); // 개행문자 제거 버전
        }
        fclose($fp);
    }

 

생성된 csv파일을 엑셀로 바로 열려고 하면 인코딩이 깨진다. 

그럴때 위 주석 처리 된 부분처럼 BOM 을 추가하면 엑셀에서도 인코딩 깨지지 않고 열린다. 

그리고 테이블에서 가져온 문자열에 개행문자가 있을경우 csv 파일에 개별의 라인으로 저장되는 이슈가 있는데 

그럴 경우 주석처리된 부분처럼 preg_replace로 개행문자를 제거 해주면 된다. 

 

 

스크립트를 실행하면 아래와 같이 csv 파일이 생성된다. 

 

 

아지 2020-04-22 "오른쪽 눈에서 눈물"
아지 2020-04-23 "아지 여전히 한쪽눈 눈물"
아지 2020-04-24 "동물병원 다녀옴 약 받아옴" #영수증
아지 2020-04-26 "눈 상태 좋아짐" "앞으로는 감기약 빨리 먹어야지 ㅠㅠ"

 

 

 

 

참고 : www.php.net/manual/de/function.fputcsv.php#121950

728x90
반응형