2012-03-23 6 views
0

다음과 같은 형식의 CSV 파일이 있으며, 쉼표로 구분 기호로 사용하여 표시된대로 Perl split 명령을 사용하고 있습니다. 문제는 내가 따옴표 붙은 문자열 "HTTP Large, GMS, ZMS: Large Files"에 쉼표가 포함되어있어 실패합니다. 배열 값은 요소 수가 적습니다. split 명령을 수정하려면 어떻게해야합니까? 같은 Text::CSV 같은 모듈이 만들어진 이유를 포함 쉼표 같은CSV 따옴표 붙은 문자열의 파싱 CSV 파일을 분할하여 사용 Perl에서

my @values = split('\,', $line); 

CSV 파일

10852,800 Mob to Int'l,235341739,573047,84475.40,0.0003,Inbound,Ber unit 
10880,"HTTP Large, GMS, ZMS: Large Files",52852810,128,13712.68,0.0002,,Rer unit 
13506,Presence National,2716766818,2447643,309116.40,0.0001,Presence,per Cnit 
+6

귀하의 질문은 질문을 구걸 도움이되기를 바랍니다 CSV-1.21/lib/Text/CSV.pm) 모듈 대신에 이런 종류의 잡아 당김을 처리합니까? –

+2

모든 학습자가 배워야 할 교훈 : CSV 또는 HTML을 혼자서는 절대 구문 분석하지 마십시오. 기존 모듈을 사용하면 대개 성숙하고 안정적이며 잘 테스트됩니다. – dgw

답변

4

문제는 정확하게이다. 데이터에 쉼표가 포함되어 있지 않은 경우에만 정규 표현식을 사용할 수 있습니다. 데이터에 쉼표가 포함되어 있으면 이제는 쉼표가 포함 된 CSV를 처리하도록 설계된 도구로 이동해야하며 Perl (및 그 친척 Text::CSV_PPText::CSV_XS)에서 Text::CSV이됩니다.

+0

나는 Text :: CSV_PP 또는 Text :: CSV_XS를 사용해야합니까? 그 차이점은 무엇입니까? 그것은 perl에서 작동 할 것인가, v5.8.7은 sun4-solaris-64-ld 용으로 빌드 – Arav

+1

당신은'Text :: CSV'를 사용하고 설치한다; 순수한 Perl 구현 인'Text :: CSV_PP' ('_PP' 접미사는 C 컴파일러가 필요없는 '순수한 Perl'을 의미합니다)가 제공됩니다. 그런 다음 시스템에서 최상의 성능을 얻으려면 Perl 확장 메커니즘과 C 코드 기능을 사용하여 동일한 코드의 고속 버전을 구현하는'Text :: CSV_XS'를 설치하십시오. 'Text :: CSV'는 Perl 5.8 이전부터 사용되어 왔습니다. 5.8.7에서 잘 작동합니다. 현재 관리자의 첫 번째 릴리스는 2007 년이었습니다. (내 개인 아카이브를 통해 검색하면 1997 년 7 월부터 Text-CSV-0.01.tar.gz를 찾았습니다.) –

+0

정보를 보내 주셔서 감사합니다 – Arav

0

나는 또한 당신과 같은 접근법을 사용하고 나와 잘 작동합니다. 이 코드를 사용해보십시오. 이유 (예를 들어)를 사용하지 않는 [`텍스트 :: CSV`] (http://search.cpan.org/~makamaka/Text- -

my @values = split(/(?<="),(?=")/, $line); 

+1

OP의 데이터와이 코드에서 '1234 '라는 코드가 깨졌습니다. 당신은 당신의 파일에 "", ""파일을 포함하고 있습니까? ","그것은 깨졌습니까? "'단지'Text :: CSV' 모듈을 사용한다면 올바른 resutls를 리턴 할 것입니다. –

+0

정보를 주셔서 감사합니다 – Arav

+0

@ Ven'Tatsu 나는 당신의 요지를 가지고 있지만 나는 단지 그가 예제와 코드를 기반으로 내 옵션을 제안했다. 분열 된 그의 질문에 근거한 교정. – quinekxi

관련 문제