2010-02-19 4 views
2

나는 나를주고 CSV 파일에 다음 줄을 문제가 있습니다FasterCSV로이 행을 구문 분석하는 올바른 방법은 무엇입니까? 구문 분석 할 때

312,'997639',' 2','John, Doe. "J.D." ',' ','2000 ',' ','Street ','City ','NY','99999','','2010-02-17 19:12:04','2010-02-17 19:12:04';

나는 다음과 같은 매개 변수를 구문 분석하고 있습니다 :

FasterCSV.foreach(file, {:headers => true, :quote_char => '"', :col_sep => "','"}) do |row| 

를 그러나 행에 최대 불고 행 열 내부의 "JD"로 인해 위의 것과 같습니다. FasterCSV로 해당 라인을 올바르게 구문 분석하려면 어떻게해야합니까?

감사합니다.

답변

0

: FasterCSV이 인용 문자로 매처 (matcher)를 사전 컴파일 때문에 다음과 같이 탈출 대신 캐릭터의 정규식에서 패스처럼 귀여운 물건을 할 수있는 방법은 없습니다 최종 결과가 단순히 적절한 CSV 출력으로 데이터의 새로운 덤프를 요청하기 때문에이 데이터로이 작업을 수행해야합니다. 시도 주셔서 감사합니다!

3

귀하의 :quote_char'이어야하며 귀하의 :col_sep,이어야합니다. 이 경우 :

FasterCSV.foreach(file, {:headers => true, :quote_char => "'", :col_sep => ','}) ... 
+0

그 결과 FasterCSV :: MalformedCSVError (FasterCSV :: MalformedCSVError) 예외가 throw됩니다. – mwilliams

+1

CSV는 어떻게 생성됩니까? 잘 형성되었다는 것이 확실합니까? : quote_char는 예제에서 작은 따옴표로 보이는 필드 주위를 감싸는 문자를 지정하고 다음을 수행합니다. col_sep는 필드 사이의 문자를 지정하며, 예제에서는 쉼표로 표시됩니다. 그것이 내 대답을 바탕으로 한 정보입니다. –

+0

문제는 형식이 올바르지 않고 어쨌든 구문 분석을 위해 FasterCSV를 구부려 고했습니다. 덤프는 고객으로부터 왔으며 이후 적절한 CSV를 출력 할 적절한 SQL 쿼리를 보냈습니다. 그동안 나는 아직도 해킹하려고하고있다. – mwilliams

1

당신은 그렇게 할 수 없습니다. 더 빠른 CSV는 인용 부호를 하나만 선택할 수 있으며 응용 프로그램에는 두 개가 필요합니다. 나는이 일을 FasterCSV을 구부릴 수 없었던

# prebuild Regexps for faster parsing 
esc_col_sep = Regexp.escape(@col_sep) 
esc_row_sep = Regexp.escape(@row_sep) 
esc_quote = Regexp.escape(@quote_char) 
@parsers = { 
    :any_field  => Regexp.new("[^#{esc_col_sep}]+", 
           Regexp::MULTILINE, 
           @encoding), 
    :quoted_field => Regexp.new("^#{esc_quote}(.*)#{esc_quote}$", 
           Regexp::MULTILINE, 
           @encoding), 
    ... 
}