CSV 파일을 처리 할 때 FGETCSV () 는 PHP에서 매우 일반적인 기능으로, 각 줄에서 파일을 라인별로 읽고 파일을 구문 분석하는 데 사용됩니다. CSV 파일의 데이터 양이 매우 크면이 데이터를 처리하는 데 다양한 문제가 발생할 수 있습니다. 그 중 하나는 필드 오버 플로우 문제입니다. 이는 일부 필드의 데이터 길이가 예상 범위를 초과하여 프로그램이 데이터를 올바르게 처리하지 않도록합니다.
이 오버플로를 피하기 위해 최대 길이를 설정하여 각 필드의 데이터가 설정 한계를 초과하지 않도록 할 수 있습니다. 이 기사는 FGETCSV () 함수를 사용할 때 필드의 최대 길이를 설정하는 방법을 소개하여 개발자가 CSV 파일의 읽기 프로세스를 더 잘 제어 할 수 있도록 도와줍니다.
먼저 fgetcsv () 함수의 기본 사용법을 간략하게 이해해 봅시다.
<span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$delimiter</span></span><span> = </span><span><span class="hljs-string">","</span></span><span>, </span><span><span class="hljs-variable">$enclosure</span></span><span> = </span><span><span class="hljs-string">'"'</span></span><span>, </span><span><span class="hljs-variable">$escape</span></span><span> = </span><span><span class="hljs-string">"\\"</span></span><span>);
</span></span>
$ 파일 : 읽어야하는 파일 리소스입니다.
$ 길이 : 데이터 행의 최대 길이를 지정합니다. 행 데이터 가이 길이를 초과하면 fgetcsv ()가 자동으로 자릅니다. 기본값은 0이므로 길이에 제한이 없음을 나타냅니다.
$ delimiter : 필드 구분 기호, 쉼표 ( , )의 기본값은 일반적으로 탭 ( \ t )과 같은 다른 구분 제일 수 있습니다.
$ enclosure : 기본적으로 이중 인용문 ( " ) 인 필드의 인클로저 문자는 필드의 특수 문자를 처리하는 데 사용됩니다.
$ ESCAPE : 탈출 문자, 필드에서 특수 캐릭터를 피하는 데 사용되는 백 슬래시 ( \ )의 기본값.
CSV 파일을 읽을 때 일부 필드의 길이가 설정 최대 길이를 초과하면 fgetcsv ()는 기본적으로 초대 부분을 읽고 처리합니다. 이를 피하려면 $ 길이 매개 변수를 설정하여 각 데이터 행의 최대 길이를 제한 할 수 있습니다.
$ 길이 매개 변수를 설정하면 각 데이터 행의 최대 바이트 수를 읽을 수 있습니다. 이렇게하면 각 필드가 미리 결정된 최대 길이를 초과하지 않도록합니다. 예를 들어, 데이터 라인 당 최대 1000 자까지 읽으려면 다음과 같이 설정할 수 있습니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">1000</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// 각 행의 프로세스 데이터</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
이 예에서 각 데이터 행의 길이는 1000 자로 제한됩니다. 특정 행의 데이터 가이 한계를 초과하면 FGETCSV () 가 초과를 자르면 길이가 초과되지 않도록합니다.
필드의 길이를보다 세분화하려면 각 데이터 행을 읽은 후 각 필드를 수동으로 확인하고 필요에 따라 자리를 자울 수 있습니다. 예를 들어, 각 필드의 최대 길이를 지정하는 배열을 설정할 수 있습니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-variable">$max_lengths</span></span><span> = [</span><span><span class="hljs-number">50</span></span><span>, </span><span><span class="hljs-number">100</span></span><span>, </span><span><span class="hljs-number">200</span></span><span>]; </span><span><span class="hljs-comment">// 우리가 가지고 있다고 가정합니다3목록,최대 길이는 다음으로 제한됩니다50、100、200</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-comment">// 여분의 필드를 잘라냅니다</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>) > </span><span><span class="hljs-variable">$max_lengths</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>]) {
</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">substr</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$max_lengths</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>]);
}
}
</span><span><span class="hljs-comment">// 각 행의 프로세스 데이터</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
이 예에서 필드의 길이는 각각 50, 100 및 200 자로 제한됩니다. 필드의 내용이 이러한 한계를 초과하는 경우, substr () 함수는 내용을 최대 허용 길이로 잘립니다.
실제로 사용하면 CSV 파일의 형식은 만족스럽지 않을 수 있거나 일부 데이터는 라인 브레이크, 탭 등과 같은 특수 문자가 있거나 일부 필드에는 쉼표 및 기타 분리기가 포함될 수 있습니다. 이 경우 데이터를 올바르게 읽고 오버플로를 피할 수 있도록 FGETCSV () 의 매개 변수를 추가로 구성 할 수 있습니다.
FGETCSV ()는 자동으로 NewLines를 건너 뜁니다 (필드에 Newlines가 포함되지 않는 한). 필드에 NewLines가 포함 된 상황이 발생하면 FGETCSV () 의 탈출 및 인클로저 매개 변수를 수정하여 이러한 문자를 처리 할 수 있습니다.
필드 자체에 구분 기자 (예 : 쉼표)가 포함 된 경우 적절한 인클로저 (예 : 이중 따옴표 ” 를 설정하여 필드의 무결성을 보장 할 수 있습니다. 이것은 CSV 형식의 표준 실습이기도합니다.
<span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'data.csv'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>);
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgetcsv</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-string">','</span></span><span>, </span><span><span class="hljs-string">'"'</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// 각 행의 프로세스 데이터</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
</span></span>
FGETCSV () 함수에서 필드의 최대 길이를 설정하면 데이터 오버플로 문제를 효과적으로 피할 수 있습니다. 라인의 최대 길이를 설정하든 각 필드를 수동으로 자르 든 합리적인 길이 한도는 CSV 파일을 읽을 때 프로그램이 더 안정적이고 효율적임을 보장 할 수 있습니다.
FGETCSV () 의 $ 길이 매개 변수의 합리적인 사용과 필드 길이 점검은 필드 오버 플로우 문제를 효과적으로 피할 수 있으므로 프로그램의 견고성과 신뢰성을 향상시킬 수 있습니다.