2012-08-10 3 views
3

저는 csv 파서 클래스 (http://code.google.com/p/php-csv-parser/)를 사용하여 CSV 파일에서 데이터를 구문 분석하고 추출합니다. 내가 만나는 문제는 특정 CSV 파일 형식에서만 작동한다는 것입니다. (Mac, MS-DOS 및 Windows 용 CSV 유형이있는 것으로 보입니다.)CSV 파일 형식 표준화

csv-windows를 사용하여 Mac에 저장 한 csv 파일을 사용하면 코드가 작동합니다. 선택권. 그러나 windows 컴퓨터에 파일을 단순히 csv로 저장하면 작동하지 않습니다. (당신은 그것이 Mac에서 csv-windows를 저장하는 것과 같은 형식 일 것이라고 생각할 것입니다.) csv-MSDOS 파일로 저장하면 Windows 컴퓨터에서 작동합니다. 이것은 약간 우스운 것처럼 보인다.

내 코드가 업로드되는 모든 유형의 csv를 읽을 수 있도록이 세 가지 파일 형식을 표준화하는 방법이 있습니까?

나는이 같은 것 생각하고 있어요 :

$standardizedCSV = preg_replace_all('/\r[^\n]/', '\r\n', $csvContent); 

나는 그것이 각 파일 형식이 라인의 끝을 처리하는 방법을 함께 할 수있는 뭔가가 알고 있지만, 나는 내려고 조금 넣어 밖으로 해요 그 차이점들. 누군가 조언이 있다면 알려주세요.

감사합니다.

UPDATE : 이 행에 의해 데이터 행을 추출 내가 사용 csv로 파서에서 관련 코드 :

$c = 0; 
$d = $this->settings['delimiter']; 
$e = $this->settings['escape']; 
$l = $this->settings['length']; 

$res = fopen($this->_filename, 'r'); 

while ($keys = fgetcsv($res, $l, $d, $e)) { 

if ($c == 0) { 
    $this->headers = $keys; 
} else { 
    array_push($this->rows, $keys); 
} 

$C++; 
} 

가 나는 할 수 있도록 내가 fgetcsv는 EOL의를 처리하는 방법을 이해하는 데 필요한 것 같아요 모든 형식의 CSV 파일이 같은 방식으로 처리되는지 확인하십시오.

+0

업데이트 csv 파서의 관련 코드를 원래 게시물에 추가하여 EOL을 처리하는 방법을 볼 수 있습니다. – user1383418

답변

1

라인 엔딩이 문제라고 생각하지 않습니다. CSV에 관한 한 가지 점은 단지 "쉼표로 구분 된 값"파일 일 뿐이며 그 이상의 표준화는되어 있지 않다는 것입니다. 따라서 일부 시스템에서는 세미콜론 (;)을 사용하여 값을 쉼표로 구분합니다. 다른 값 구분 기호를 사용하는 변형이 있다고 확신합니다.

또한 CSV 파일간에 이스케이프 문자 (대개 백 슬래시 \)가 다를 수 있으며 일부 CSV 파일은 각 값 (")을 따옴표로 묶습니다.

CSV 파일은 위의 모든 변형을 사용할 수 있습니다. 예를 들어 Microsoft Excel에서는 CSV 파일을 세미콜론을 사용하여 값을 구분하여 내보내고 값을 따옴표없이 인용 할 수 있습니다.

CSV 파일을 구문 분석하는 방법을 자동으로 감지하는 방법이 있지만 가장 좋은 방법은 사용자가 결정할 수 있도록하는 것입니다. 그것이 엑셀이하는 것입니다. 당신이 CSV 파일을 사용하는 경우

+0

EOL이 문제라고 생각하는 이유는 파서가 위에서 언급 한 비 호환 cvs 유형을 실행할 때 $ csvparser-> headers 변수가 전체 파일을 기록한다는 것입니다. 첫번째 줄. 호환 CSV 형식은 헤더를 $ this-> 헤더에, 헤더 행을 $ this-> 행에 깔끔하게 저장합니다. 따라서 어떤 파일 유형의 EOL은 while 루프를 반복하고 다른 루프는 그렇지 않습니다. – user1383418

+0

또한 - 텍스트 편집기에서 호환되고 준수하지 않는 CSV 파일 유형을 나란히 표시하면 값을 구분하는 쉼표와 정확히 동일하게 나타납니다. (나는 이것을하기 위해 BBEdit을 사용하고 있습니다.) 두 가지의 유일한 차이점은 BBEdit는 호환 버전이 'Windows (CRLF)'형식임을 나타냅니다. (BBEdit 창의 하단에있는 드롭 다운에 있습니다. 그러나 'EOL'을 보지 마십시오 .. – user1383418

0

, 제대로 표준화되지 않는 많은 세부 사항에 동의해야합니다 :

  • 라인 엔딩을 (유닉스 0x0a, 매킨토시 0x0d로, DOS의 0x0d로의 0x0a)
  • 필드 구분 기호 (쉼표, 세미콜론 등)
  • 필드 인용 (모든 필드 인용, 문자열 필드, 필드 및 행 구분 기호가 포함 된 문자열 필드 만)
  • 문자열 필드 내에서 큰 따옴표를 이스케이프 처리합니다 (큰 따옴표 두 배, 큰 따옴표 앞의 백 슬래시 문자 등).)
  • 여러 줄 문자열 필드 (
  • 파일 인코딩 (ISO-8859-1, UTF-8 등)이 CSV 리더를 만드는 경우

하면, 자동으로 다른 처리 할 수있는)가 허용 여부입니다 라인 엔딩의 변형 및 필드 인용. 그러나 나머지는 사전에 CSV 파서에 알려 져야합니다.

defacto 표준은 Excel에서 생성 한 CSV 형식입니다. (하지만 난 Macintosh 용 Excel에서 그것을 시도 적이)

보통
  • DOS 라인 엔딩
  • 필드의 구분은 지역에 따라 그러나, 엑셀 다른 형식의 변형을 사용합니다. 쉼표를 사용하여 숫자를 긴 숫자로 그룹화하는 경우 Excel에서는 세미콜론을 필드 구분 기호로 사용합니다. 그렇지 않으면 쉼표.
  • Excel에서는 필요에 따라 큰 따옴표를 사용합니다.
  • Excel은 문자열 필드에서 큰 따옴표를 두 배로 늘립니다.
  • Excel은 여러 줄 문자열 필드를 지원합니다.
  • 파일 인코딩은 현재 로캘의 파일 인코딩 인 것 같습니다. 그래서 다릅니다.
+0

그 상세한 답변을 보내 주셔서 감사합니다. 한 줄의 파일에는 작동하지만 다른 곳에서는 작동하지 않는 DOS 형식 (0x0d 0x0a)을 따르도록 줄 끝을 표준화했습니다. 해당 파일이 다른 방식으로 호환되지 않았는지 확인하십시오 - 예를 들어 정보를 구분하기 위해 쉼표 대신 콜론을 사용했을 수 있습니다. 나는 아침에 그 파일을보고 다시보고하겠습니다. 고마워요. – user1383418