2013-05-12 1 views
4

나는 간단한 CSV 파일을 | (파이프)를 인용 문자로 사용합니다. Ruby 1.9.2에서 1.9.3으로 레일즈 앱을 업그레이드 한 후 "CSV :: MalformedCSVError : 행 1에 누락 또는 따옴표가 들어 있습니다"오류가 발생합니다.quote_char가 ruby ​​CSV 가져 오기에 적합 함

정력을 열어 | 작은 따옴표 나 심지어 "="를 사용하면 파일이 잘 작동하지만 | 및 * 오류가 발생합니다. 누구든지이 문제의 원인에 대해 의견이 있습니까? 여기서 오류를 재현 할 수있는 간단한 한 줄의 :

@csv = CSV.read("public/sample_file.csv", {quote_char: '|', headers: false}) 

또한 IRB OUT/w 로딩 레일 루비도 2.0에이를 재현.

편집 : 여기에 내가 그냥 CSV 루비 모듈에서 버그를 발견 한 생각 CSV

|076N102     |,|CARD         |,|   1|,|NEW|,|PCS  | 
|07-1801     |,|BASE         |,|  18|,|NEW|,|PCS  | 
+1

public/sample_file.csv에서 몇 줄을 추가하여 데이터를 표시하는 방법은 어떻습니까? – hd1

+0

@ hd1 done - 위를 참조하십시오! –

+0

그건 저에게 예외를주지 않습니다. 파일에 재미있는 바이트가 있습니까? CSV를 'cat -v'하면 이상하게 보입니까? –

답변

6

에서 일부 샘플 라인이다. csv.rb에서 :

1587: @re_chars = /#{%"[-][\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding)}/ 

이 정규 표현식은 "파이프"문자 |을 포함하여 특수 정규식 기호와 충돌 문자를 이스케이프하는 데 사용됩니다.

편집 : 당신이 그것을 제거 할 경우, 귀하의 예제가 작동하기 시작하므로 나는 앞두고 붙이는 [-]에 대한 이유를하지 않는 하이픈 (괄호 []으로 둘러싸인) 문자 집합 식 내부에서 탈출 할 수있는 경우에만 주인공이 아닌 경우. 그래서 고정 정규 표현식 업데이트했다 : 대부분의 언어는 한정사와 lookbehind 식을 지원하지 않습니다

1587: @re_chars = /#{%"(?<!\\[)-(?=.*\\])|[\\.^$?*+{}()|# \r\n\t\f\v]".encode(@encoding)}/ 

CSV.read('sample.csv', {quote_char: '|'}) 
# [["076N102     ", 
# "CARD         ", 
# "   1", "NEW", "PCS  "], 
# ["07-1801     ", 
# "BASE         ", 
# "  18", "NEW", "PCS  "]] 

로를, 루비 내가 왼쪽 브래킷에 대한 부정적인 버전으로 작성했다 포함되어 있습니다. 또한 대괄호 쌍 중 왼쪽 하나가 누락 된 하이픈과 일치합니다. 더 나은 해결책을 찾으려면 코멘트 pls를 남겨 두십시오.

ruby-lang.org에 버그 보고서를 채우기 전에 의견이 있으면 다행입니다.

+0

Ruby 2.0.0p195가 방금 릴리스되었으므로이 문제가 해결되지 않으므로 버그를 제출하고 패치를 제출하면 많은 도움이됩니다. –

+1

이미 누군가가 버그 보고서를 작성했습니다 - https://bugs.ruby-lang.org/issues/8405 – Torimus

관련 문제