2011-02-14 4 views
2

아래의 Perl 코드에 약간의 문제가 있습니다. 수동으로 작성한 CSV 파일을 열어 읽을 수 있지만 CSV 파일로 저장 한 Mac Excel 스프레드 시트를 열려고하면 아래 코드에서이 파일을 모두 한 줄로 읽습니다. 필드는 필드 분리되지 않은 콤마를 포함 할 때 split -ing (예를 들어 도움이 안 될 경우가 많이 있기 때문에Mac Excel에서 Perl로 작성한 CSV 파일 열기

#!/usr/bin/perl 

use strict; 
use warnings; 

open F, "file.csv"; 

foreach (<F>) 
{ 
    ($first, $second, undef, undef) = split (',', $_); 
} 

print "$first : $second\n"; 

close(F); 
+0

OS X 또는 Windows에서 Perl을 실행하고 있습니까? Windows의 경우 OS X에서 파일이 어떻게 이동합니까? –

답변

10

항상이 목적 (예 Text::CSV 또는 Text::CSV_XS 같은) 특수한 모듈을 사용 하지만 따옴표 안에 있음).

2

Mac에 대해서는 잘 모르겠지만 Windows 버전은 모든 값을 따옴표로 묶습니다. "like","this". 또한 값에 인용 부호가있을 가능성을 고려해야합니다.이 값은 "like""this"으로 표시됩니다 (해당 값에 "이 하나뿐입니다).

그러나 실제로 질문에 대답하려면 예상했던 것과 다른 개행 문자를 사용하고있는 것 같습니다. \n 대신 \r\n으로 저장 중이거나 그 반대의 경우도 마찬가지입니다.

5

기존 매킨토시 (시스템 9 이전 버전)는 CR (0x0D, \ r)을 줄 구분 기호로 사용합니다. Mac OS X (Unix 기반)는 기본 줄 구분 기호로 LF (0x0A, \ n)를 사용하므로 Unix 도구 인 perl 스크립트는 LF를 기대하지만 CR을 얻고 있습니다. 파일에는 줄 분리 기호가 없으므로 한 줄만 있다고 생각합니다. Windows 줄 끝 (CR, LF)이 있다면 각 줄 끝 부분에 보이지 않는 CR이 표시 될 수 있습니다.

0x0D를 0x0A로 대체하는 입력에 대한 빠른 루프가 문제를 해결해야합니다.

3

Mac 용 Excel 2004에서 직접이 문제가 발생했습니다. 줄 끝은 실제로 \r이고 IIRC, 텍스트는 MacRoman 문자 집합을 사용합니다. Latin-1 또는 UTF-8이 아닌 예상 한 것입니다.

그래서뿐만 아니라 \r에 텍스트 :: CSV/텍스트 :: CSV_XS 및 분할을 사용할 수있는 좋은 조언은, 당신이 그렇게 같은 MacRoman도 인코딩을 사용하여 파일을 열고 자합니다

마찬가지로
open my $fh, "<:encoding(MacRoman)", $filename 
    or die "Can't read $filename: $!"; 

, Windows에서 Excel로 내 보낸 파일을 읽을 때 해당 코드에서 :encoding(MacRoman) 대신 :encoding(cp1252)을 사용할 수 있습니다.

+0

왜이 CW를 표시 했습니까? 그것은 아주 좋은 대답입니다. – DVK

2

다른 사람들도 의심해 봤지만 줄 바꿈은 아마도 탓할 것입니다. 필자의 리눅스 기반 시스템에는 이러한 줄 바꿈을 변경할 수있는 유틸리티가 내장되어있다. 내가 생각 mac2unix는 (. 당신은) 당신에 대해 걱정하지 않을 수 있습니다 리눅스 및 Mac (마이크로 소프트에 모두 비슷한 있어야합니다.

을 원할 경우 파일을 읽고 당신을위한 라인 엔딩을 변경됩니다 dos2unix 주변 단지 래퍼입니다 이 파일을 Perl에서 처리하려면 "입력 레코드 분리 기호"를 "\ n"에서 "\ r"(오른쪽 끝이 맞으면)으로 설정하는 $/ 변수를 조사하십시오. 파일을 읽기 전에 local $/ = "\r"을 시도하십시오. perldoc perlvar ($/ 근처) 또는 perldoc perlport (휴대용 Perl 코드 작성에만 해당)

PS이 부정확 한 부분을 알고 싶다면 Mac을 사용하지 않습니다. 그냥 이론을 알고 있다고 생각합니다.

0

줄 바꿈을 처리하는 "특수 변수"를 설정하면 \ 한 번에 한 줄씩 읽을 수 있습니다 : $/= "\ r"; 이 특별한 경우에 perl을위한 mac 새로운 라인은 디폴트 \ n이지만 파일은 아마도 \ r을 사용하고있을 것입니다. 이것은 Flynn1179 & Mark Thalman이 말한 것을 구성하지만 while() 스타일 읽기를 사용하기 위해 무엇을해야하는지 보여줍니다.