Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP로 CSV 파일 파싱하기: fopen·fgetcsv부터 str_getcsv까지 완벽 정리

PHP에서 CSV 파일을 읽고 데이터를 처리해야 하는 경우는 매우 흔합니다. 이 글에서는 대표적인 두 가지 방법을 예제 코드와 함께 자세히 설명합니다.

방법 1: fopen()과 fgetcsv()로 한 줄씩 읽기

먼저 fopen() 함수에 .csv 파일의 경로를 지정하여 파일을 엽니다. 그런 다음 fgetcsv()를 이용해 각 줄을 배열 형태로 읽어올 수 있습니다.

예제 코드

$row_count = 1;
if (($infile = fopen("path to .csv file", "r")) !== FALSE) {
    while (($data_in_csv = fgetcsv($infile, 800, ",")) !== FALSE) {
        $data_count = count($data_in_csv);
        echo "<p> {$row_count}번째 줄의 데이터 개수: {$data_count} <br /></p>\n";
        $row_count++;
        for ($counter = 0; $counter < $data_count; $counter++) {
            echo $data_in_csv[$counter] . "<br />\n";
        }
    }
    fclose($infile);
}

코드 설명

  • fopen(): 파일이 존재하면 읽기 모드("r")로 열어 파일 핸들을 반환합니다.
  • fgetcsv(): 지정한 최대 길이(여기서는 800바이트)까지 한 줄을 읽고, 쉼표(,)를 구분자로 하여 각 필드를 배열 요소로 분리합니다.
  • $row_count: 행 번호를 추적하는 카운터입니다. 루프가 반복될 때마다 1씩 증가하여 다음 줄을 계속 파싱할 수 있습니다.
  • fclose(): 작업이 끝나면 반드시 파일 핸들을 닫아 리소스를 해제해야 합니다.

실행 결과

입력된 CSV 파일이 한 줄씩 순서대로 파싱되어 화면에 출력됩니다. 각 줄마다 포함된 데이터(필드)의 개수와 함께 해당 줄의 내용이 표시됩니다.

방법 2: PHP 5.3.0 이상에서 str_getcsv() 활용하기

PHP 버전이 5.3.0 이상이라면 file() 함수와 str_getcsv() 함수를 조합해 더 간결하게 처리할 수 있습니다.

$file_to_read = file('path to .csv file');
$data_to_ingest = [];
foreach ($file_to_read as $infile) {
    $data_to_ingest[] = str_getcsv($infile);
}

file()은 파일 전체를 읽어 각 줄을 요소로 가지는 배열로 반환하고, str_getcsv()는 문자열로 된 각 줄을 CSV 형식에 맞게 파싱합니다. 그 결과 모든 데이터가 $data_to_ingest라는 2차원 배열에 저장됩니다.

주의 사항

이 방식에는 한 가지 제약이 있습니다. file() 함수가 개행 문자(newline)를 기준으로 줄을 나누기 때문에, CSV 파일 안에 개행 문자가 포함된 필드(예: 따옴표로 묶인 여러 줄 텍스트)가 있다면 올바르게 인식하지 못합니다. 따옴표 처리도 완벽하게 지원하지 않으므로, 이러한 경우에는 방법 1의 fgetcsv() 방식을 사용하는 것이 안전합니다.

마무리

정리하면, 일반적인 CSV 파일 파싱에는 fopen() + fgetcsv() 조합이 가장 안정적이며, 구조가 단순한 파일을 빠르게 다룰 때는 file() + str_getcsv() 조합이 편리합니다. 파일 크기와 데이터 형식에 따라 적절한 방법을 선택하세요.