2009-11-27 5 views
15

FasterCSV (1.5.0)와 CSV 구문 분석 문제가 발견되었지만 진짜 버그 인 것 같지만 해결 방법이 필요합니다.FasterCSV gem을 사용하여 CSV 구문 분석의 기본 문제 극복하기

기본적으로 필드가 따옴표로 묶일 때 구분 기호 (내 경우에는 쉼표) 뒤에 공백을 추가하면 MalformedCSVError이 생성됩니다.

다음은 간단한 예제 :

# No quotes on fields -- works fine 
FasterCSV.parse_line("one,two,three") 
=> ["one", "two", "three"] 

# Quotes around fields with no spaces after separators -- works fine 
FasterCSV.parse_line("\"one\",\"two\",\"three\"") 
=> ["one", "two", "three"] 

# Quotes around fields but with a space after the first separator -- fails! 
FasterCSV.parse_line("\"one\", \"two\",\"three\"") 
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1. 

오전 내가 미친 것, 또는이 FasterCSV의 버그?

답변

14

여기에 MalformedCSVError이 맞습니다.

CSV 형식의 앞/뒤 공백은 무시되지 않으며 필드의 일부로 간주됩니다. 즉, 공백이있는 필드를 시작한 다음 해당 필드에 이스케이프 처리되지 않은 큰 따옴표를 포함하면 잘못된 인용 오류가 발생할 수 있습니다.

어쩌면이 라이브러리는 사용했던 것보다 훨씬 엄격 할 수 있습니다.

+0

필드가 실제로 따옴표로 묶이지 않는다고 말하는 공간이 아니며 (첫 번째 문자는 따옴표가 아니므로) 필드 내용의 일부로 따옴표를 사용해야합니까? –

+1

내가 틀렸어. "필드가 큰 따옴표로 묶이지 않으면 큰 따옴표가 필드 안에 나타나지 않을 수 있습니다." - http://tools.ietf.org/html/rfc4180#section-2 –

+0

당신 말이 맞아, CSV를위한 '사양'이 있다는 것을 깨닫지 못했지만 그것이있는 것 같습니다. 더 빠른 CSV는 실제로 매우 엄격합니다. – Olly

2

아마도 : col_sep : 옵션을 ','로 설정하면 파일을 구문 분석 할 수 있습니다.

2

나는 :col_sep 옵션이 정규 표현식을 허용하기를 희망했지만, 읽기와 쓰기 모두에 사용되는 것처럼 보이기 때문에 수치 스럽습니다. documentation 많은 희망을 보유하지 않으며, 당신의 필요는 아마 당신이 명시 적으로 #parse_line를 호출하는 경우 변경을 요청하거나 패치 ;-)

을 제출하여 충족 될 수있는 것보다 더 즉각적이다, 당신은 항상

부를 수
gsub(/,\s*/, ',') 

입력란에 따옴표로 묶은 문자열 내에 쉼표 공간의 가능성을 예상 할 경우 정규식을 크게 변경해야 할 수도 있습니다. (나는 적절한 태그를 사용하여 그러한 질문을 다시 게시하고 RegEx 전문가가 그 일을해야한다고 제안했다.)

관련 문제