현재 위치: > 최신 기사 목록> FGETCSV의 파일 포인터 관리 기술, 반복적 인 데이터 읽기를 피하는 방법은 무엇입니까?

FGETCSV의 파일 포인터 관리 기술, 반복적 인 데이터 읽기를 피하는 방법은 무엇입니까?

gitbox 2025-09-09

PHP를 사용하여 CSV 파일을 처리 할 때 FGETCSV ()는 CSV 파일을 라인별로 읽고 각 데이터 라인을 배열로 구문 분석 할 수있는 매우 일반적이고 효율적인 기능입니다. 그러나 FGETCSV ()는 대형 파일을 처리 할 때 파일 포인터로 실수로 관리되는 경우 데이터를 반복적으로 판독하고 특정 줄을 건너 뛸 수 있습니다. 이러한 문제를 피하려면 파일 포인터 관리 기술을 마스터해야합니다. 이 기사는 데이터의 반복적 인 읽기를 효과적으로 피하고 모든 행을 읽는 모든 행이 올바른지 확인하는 방법으로 뛰어납니다.

1. 파일 포인터 및 fgetcsv () 의 작동 원리를 이해합니다.

PHP에서 파일 포인터는 현재 읽거나 쓰고있는 파일의 위치를 ​​표시하는 데 사용됩니다. 파일을 열고 fgetcsv () 함수를 사용하여 데이터를 읽을 때 파일 포인터는 각 읽기 작업에 따라 한 줄을 이동합니다. 파일을 읽으면 포인터는 파일 끝에 남아 있습니다.

fgetcsv ()가 호출 될 때마다 현재 위치에서 CSV 데이터 행을 읽기 시작하고 포인터를 한 행 아래로 이동합니다. 우연히 파일 포인터를 조작하면 다음 상황이 발생할 수 있습니다.

  • 반복 읽기 : 파일 포인터가 올바르게 이동하지 않기 때문에 프로그램이 처리 된 데이터를 다시 읽을 수 있습니다.

  • 건너 뛰기 데이터 : 파일 포인터가 너무 많이 점프하여 일부 행이 누락됩니다.

2. ftell ()fseek ()를 사용하여 파일 포인터를 제어하십시오

읽을 때마다 파일 포인터가 올바르게 배치되도록하려면 ftell ()fseek () 함수를 사용하여보다 자세한 제어를 수행 할 수 있습니다.

  • ftell () : 현재 파일 포인터의 위치를 ​​가져옵니다.

  • fseek () : 주어진 오프셋에 따라 파일 포인터를 지정된 위치로 이동합니다.

이 두 기능은 특정 상황에서 파일 포인터를 재배치하고 중복 또는 누락 된 데이터를 읽는 데 도움이 될 수 있습니다.

샘플 코드 :

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-variable">$lineNumber</span></span><span> = </span><span><span class="hljs-number">0</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-literal">FALSE</span></span><span>) {
        </span><span><span class="hljs-variable">$lineNumber</span></span><span>++;
        
        </span><span><span class="hljs-comment">// 현재 포인터 위치를 얻으십시오</span></span><span>
        </span><span><span class="hljs-variable">$position</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ftell</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>);
        
        </span><span><span class="hljs-comment">// 현재 라인의 내용을 인쇄하십시오</span></span><span>
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Line <span class="hljs-subst">$lineNumber</span></span></span><span>: " . </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">", "</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
        
        </span><span><span class="hljs-comment">// 어떤 경우에는(예를 들어, 특정 줄을 건너 뜁니다)사용 가능fseek지정된 위치에 위치합니다</span></span><span>
        </span><span><span class="hljs-comment">// fseek($file, $position + 100);  // 예:뛰어 올라100바이트</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><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. fgetcsv ()를 사용할 때 반복 읽기를 피하기위한 팁

루프에서 CSV 파일을 읽을 때 일반적으로 다음 상황에 직면합니다. 반복적 인 읽기를 피하기 위해 해당 조치를 취할 수 있습니다.

3.1 파일의 일부 데이터를 미리 읽으십시오

파일 헤더 가져 오기 또는 특정 조건을 확인하는 등 데이터를 읽기 전에 파일에서 일부 전처리를 수행 해야하는 경우 첫 번째 데이터 줄을 읽은 후 파일 포인터를 앞으로 이동할 수 있습니다.

3.2 읽기 중에 데이터를 처리 할 때 기록 위치

CSV 파일을 처리 할 때 파일 포인터의 위치에 따라 일부 데이터를 읽었는지 확인할 수 있습니다. 예를 들어, 파일의 끝이 ftell () 함수의 반환 값을 기반으로 파일의 끝에 도달했는지 또는 일부 잘못된 데이터를 건너 뛰어야하는지 여부를 결정할 수 있습니다.

3.3 캐시 메커니즘을 통해 동일한 컨텐츠를 여러 번 읽지 마십시오.

CSV 파일의 일부 내용이 여러 번 (헤더 데이터 또는 특정 특정 행)를 읽을 수있는 경우 캐시를 사용하여 불필요한 반복 판독 값을 피하기 위해 데이터를 임시로 저장할 수 있습니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</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">if</span></span><span> (</span><span><span class="hljs-variable">$file</span></span><span>) {
    </span><span><span class="hljs-variable">$cache</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-literal">FALSE</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-number">0</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__">in_array</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$cache</span></span><span>)) {
            </span><span><span class="hljs-comment">// 처리 데이터</span></span><span>
            </span><span><span class="hljs-variable">$cache</span></span><span>[] = </span><span><span class="hljs-variable">$key</span></span><span>;
            </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">implode</span></span><span>(</span><span><span class="hljs-string">", "</span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>) . </span><span><span class="hljs-string">"\n"</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><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

4. 파일 끝에 올바른 처리

파일을 읽으면 파일 포인터의 위치에 특별한주의를 기울여야합니다. 경우에 따라 FGETCSV ()는 파일 끝에서 빈 줄이나 특정 문자로 인해 일찍 종료 될 수 있으며 더 이상 False를 반환하지 않습니다. 이 시점에서 Feof () 함수를 사용하여 파일의 끝이 도달했는지 확인하거나 fgetcsv () 에 의존하여 False를 반환하여 끝을 표시 할 수 있습니다.

5. 요약

FGETCSV () 는 강력한 기능이지만 파일 포인터를 올바르게 관리하는 것이 정확한 데이터를 읽는 데 핵심입니다. ftell ()fseek () 와 같은 함수를 사용하면 반복 된 판독 값을 피하거나 데이터를 건너 뛰는 것을 피하거나 파일 포인터의 위치를 ​​정확하게 제어 할 수 있습니다. 또한, 캐시와 논리적 판단의 합리적인 사용은 읽기 효율성을 더욱 향상시키고 불필요한 자원 소비를 줄일 수 있습니다. 이 기사의 기술을 통해 fgetcsv () 의 사용을 더 잘 마스터하고보다 복잡한 CSV 파일을 처리 할 수 ​​있기를 바랍니다.