ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • csv 파일 생성하기
    프로그래밍/PHP 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
    반응형
Designed by Tistory.