2013-01-10 3 views
3

나는 fgetcsv()에서 쉼표로 구분 된 값 파일을 읽으려고합니다. 일반적으로 예상대로 작동하지만 일부 열이 새 데이터 줄로 분할되지 않고 하나의 파일로 처리되는 대신 파일을 발견했습니다. pastie.org/5664800fgetcsv 이상한 곳에서 열을 나누기

문제를 생성 된 열은 설명을 구성하는 여러 줄로 하나입니다 : 여기

나에게 문제를주는 라인의 예입니다. 그 다음 줄에 도달하면

fgetcsv 첫 번째 읽기를 끝 : 나는 코드가있는 경우

- Length/Width/Height: 3.75\""x2.4\""x2.4\"" (95.25X60.96x60.96) 

그래서 예를 들어, :

ini_set('auto_detect_line_endings', true); 

while ($row = fgetcsv($filepointer, 5000, ',', '"') { 
    echo '<pre>'; var_dump($row); echo '</pre><br />'; 
} 

을 그 끝에 하나 개의 데이터 대부분은 전체 행을 얻을 "Length/Width/Height: 3.75\"x2.4\""x2.4\"" (95.25X60.96x60.96)"에 넣고 그 다음에 오는 모든 개행은 끝까지 모든 행의 자체 행으로 처리됩니다.

여기에 무슨 일이 일어나고 있는지 아십니까?

+0

이상한입니다. [그것은 나를 위해 작동합니다.] (http://ideone.com/wlaIGU) PHP 버전은 무엇입니까? –

+0

그것은 이상합니다. PHP 5.3.16입니다. – eComEvo

+0

흠. 내 컴퓨터의 PHP 5.3.10 및 IDEone 5.2.12에서 작동합니다. 그냥, IDEone에서 내 테스트 스크립트를 다운로드하고 실패한 것인지 확인할 수 있습니까? –

답변

5

문제는 데이터가 문자 순서 \""이 포함되어 있다는 것입니다 동봉 된 문자열 내에서 발생하는 경우 "인클로저 문자를 탈출하는 방법이다. 맥락에서, 이것이 것을 분명 리터럴 문자열 \" 표현하기 위해을 가정;. 이스케이프 문자로 큰 따옴표가 그것을 배로 탈출하고있는 동안, 즉, 역 슬래시는 리터럴 백 슬래시 있어야하는데 기본적으로

그러나 fgetcsv() 취급 백 슬래시 , 문자를 파싱합니다. rs \"을 백 슬래시 이스케이프 처리 된 리터럴 이중 따옴표로 사용하고 두 번째 "이 큰 따옴표로 묶인 문자열을 끝내는 것으로 가정합니다.

수정 사항은 PHP 5.3.0 이상을 사용하는 한 간단합니다. fgetcsv()은 다른 문자를 다섯 번째 매개 변수로 전달하여 백 슬래시를 이스케이프 문자로 처리하지 말라고 말하십시오. 분명히, 완전히 이스케이프 문자를 사용하지 않도록 작동하지 않습니다 null 또는 false 또는 ''를 전달하지만 '"' (인용 문자로 즉 같은 값)을 통과하는 것은 수행합니다

while ($row = fgetcsv($filepointer, 0, ',', '"', '"')) { 
    var_export($row); 
    echo "\n"; 
} 
+0

Brilliant! 고마워요! 이것은 문제의 전체 연쇄 반응을 실제로 해결했습니다 : D – eComEvo

+0

이것은 많은 정보를 제공합니다! 감사합니다 !! – ekerner

+1

이제 fputcsv에 대해 동일한 인수가 필요하므로 RFC 호환 CSV를 실제로 왕복 할 수 있습니다 ... –

0

fgetcsv()에 다섯 번째 인수는

+0

'' '문자가 그의 데이터에서 전혀 이스케이프되지 않는 것 . – Sammitch

+1

@Sammitch 큰 따옴표는 ""처럼 두 배로 이스케이프 처리됩니다. – eComEvo