2012-06-26 2 views
-2

나는 ... 변수 펄 분할 CSV 라인

# sample data 
"100-001","Bla Bla, Bla, Bla","","",0.00000,"W1",6.000,0.000 

내가 이것을 시도했지만 작동하지 않을 수 있도록 숫자 필드 ""없는

으로 CSV 라인을 분할 필요

($var0,$var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8) = split(/\","/); 

감사합니다 ...

+5

Text :: CSV를 살펴 보셨습니까? – Tim

+4

문자열 "작동하지 않습니다"는 Perl에서 내장 된 오류 메시지가 아닙니다. –

+5

Text :: CSV 사용 - 모두 완료되었습니다. –

답변

0

이 작동됩니다

($var0,$var1,$var2,$var3,$var4,$var5,$var6,$var7,$var8) = 
    split(/(?<="|[0-9]),(?="|[0-9])/); 
  • ?<=는 파서를 사용해야하는 내다 주장 CSV를 들어
+1

첫 번째 데이터 요소를''100-001 ''("100-001"대신에)으로 변경하고 다른 많은 c.s에서 작동하지 않으면 ** 작동하지 않을 것입니다. 정규 표현식으로 csv를 구문 분석하는 것은 거의 _rocket science_, Friedls [Regex Book] (http://books.google.de/books?id=sshKXlr32-AC&lpg=PP1&hl=de&pg=PP1#v=onepage&q=false) 한 장] (http://books.google.de/books?id=sshKXlr32-AC&lpg=PP1&hl=de&pg=PA213#v=onepage&q&f=false). –

+1

@rubberboots 그건 ** ** 정확합니다. 이는 OP가 제공 한대로 쉼표가 포함 된 CSV 필드의 규칙을 위반하게됩니다. 그의 데이터 세트가 일종의 논리를 따른다고 가정해야합니다. OP는 귀하의 데이터에 견줄만한 견적이 있습니까? 제공된 입력에 대해 – ZnArK

+0

을 입력하면 정규식이 작동합니다. 또 다른 경계 사례는 쉼표'... ","... "또는'csvtext, csvtext' 주위의 _whitespace_입니다. –

4

lookbehind 주장

  • ?=이다. Text :: CSV가 확실합니다. 모듈을 설치하기가 어려울 경우 Text::CSV_PP이라는 Pure Perl 구현을 사용할 수 있습니다. 파일에 붙여넣고 사용하십시오. 문제 해결됨.

    다른 공격 방법은 핵심 모듈 Text::ParseWords을 사용하는 것입니다.이 모듈은 괜찮은 CSV 구문 분석을 수행 할 수 있습니다.

    #!/usr/bin/env perl 
    
    use strict; 
    use warnings; 
    
    use Text::ParseWords; 
    
    print "$_\n" for parse_line(',', 0, '"100-001","Bla Bla, Bla, Bla","","",0.00000,"W1",6.000,0.000'); 
    
  • +0

    좋은 해결책 !! – ZnArK