2017-12-08 1 views
0

ISO-8859-1로 인코딩 된 .csv 파일의 일부 데이터를 읽고 PostgreSQL 데이터베이스는 UTF-8로 인코딩되어 있으며, 처리중인 파일의 행에 따라 두 개의 오류가 발생합니다.PHP fgetcsv() 함수를 사용하여 데이터를 관리하면서 "정의되지 않은 오프셋"및 "UTF8을 인코딩 할 때 잘못된 바이트 시퀀스"오류가 발생했습니다.

내가 fgetcsv을 사용하여 파일에서 데이터를 받고 있어요() 함수 :

$foo = my_function($file_line[$index]); 

:

while (($line = fgetcsv($handle,0,';','"')) !== false) { 

오류가 나는이 같은 함수를 호출 한 줄에 "정의되지 않은 오프셋"된다 PostgreSQL 테이블에 데이터를 삽입하려고하면 "UTF8 인코딩을위한 잘못된 바이트 시퀀스"오류가 발생합니다.

파일에는 날짜 필드, 숫자 필드 및 특수 문자와 악센트가있는 여러 줄 텍스트 필드가 포함 된 복잡한 데이터가 들어 있으며 모든 줄에는 비어있는 경우에도 모든 필드가 있습니다.

+0

나는이 문제를 해결하기 위해 시간을 보냈지 만 비슷한 문제가있는 다른 사람들을 돕기 위해 어떻게 해결했는지 게시하고 있습니다. 나는 그것이 어딘가에 도움이되기를 바랍니다. –

답변

0

배열에 인덱스 정보가 없기 때문에 "undefined offset"오류가 발생했습니다. 그러나 모든 파일 행에는 모든 필드가 있어야합니다.

실제 문제는 fgetcsv 함수에서 "이스케이프 문자"를 설정하지 않았으며 텍스트 끝에 슬래시 (기본 이스케이프 문자)가 필드 끝에 나타났습니다.이 함수는 fgetcsv 함수를 만들고있었습니다. 구분 문자를 고려하지 않고 배열 데이터를 엉망으로 만든다.

이이 같은 "chararcter 탈출"로 이상한 문자를 설정함으로써 해결되었다 :

오류은 "UTF8 인코딩 잘못된 바이트 시퀀스는"변환 후 데이터에서 모든 틀에 얽매이지 않는 문자를 제거하여 해결되었다
while (($line = fgetcsv($handle,0,';','"','')) !== false) { 

$field_content = preg_replace('/[^\x{0020}-\x{007E}\x{00c0}-\x{00fd}\x{000a}\x{0009}]/', '',$field_content); 
$field_content = utf8_encode($field_content); 
관련 문제