2013-01-10 2 views
1

지금 레일스에서 ​​일부 CSV를 구문 분석하는 데 심각한 문제가 있습니다. 기본적으로 내 앱에 사용자가 CSV 파일을 업로드합니다. 그런 다음 파일을 변환하여 UTF-8 형식인지 확인한 다음 구문 분석하고 처리합니다. 응용 프로그램에서 구문 분석을 시도 할 때마다 "1 행에 잘못된 내용의 인용문이 있습니다"라는 메시지가 나타납니다.레일이있는 잘못된 CSV 오류 (CSV)

원본 파일을 새 문서에 복사하여 저장하면 어떻게됩니까? 문제없이 레일 콘솔에서 파싱 할 수 있습니다. 내가 구문 분석하려고하면

내가 원래 파일을 구문 분석하려고하면, 그것은 UTF-8 인코딩에 대한 잘못된 문자 (파일이 UTF-8 따라서 응용 프로그램은 변환에없는)

뿌려 파일을 UTF-8로 변환하고 줄 끝을 LF로 변경하면 구문 분석이 실패합니다.

내가 만든 파일 버전과 응용 프로그램에서 만든 파일 사이에 차이점이있는 경우 (작동하는) 복사/붙여 넣기 버전에 0 차이가 있으므로 왜 구문 분석이 불가능한 지 알 수 없습니다. 하나는 그렇지 않다.

제안 사항? 다음과 같이 내 애플 파일을 처리 :

def create 
@survey = Survey.new(params[:survey]) 

# Now we need to try and convert this to UTF-8 if it isn't already 
encoded = File.read(@survey.survey_data.current_path) 
encoding = CharlockHolmes::EncodingDetector.detect(encoded) 

# We've got a guess at the encoding, 
# so we can try and convert it but it 
# may still fail so we need to handle 
# that 
begin 
    re_encoded = CharlockHolmes::Converter.convert(encoded, encoding[:encoding], 'UTF-8') 
    re_encoded = re_encoded.gsub(/\r\n?/, "\n") 

    # Now replace the uploaded file 
    File.open(@survey.survey_data.current_path, 'w') { |f| 
    f.write(re_encoded) 
    } 
rescue ArgumentError 
    puts "UH OH!!!!!" 
end 

puts "#{@survey.survey_data.current_path}" 
@parsed = CSV.read(@survey.survey_data.current_path) 

끝에 그 어떤 변화도 가져 오지면

파일 업로드 보석 CarrierWave입니다.

나를 미치게 만드는 사람이 나를 도와 줄 수 있습니까?

편집

오류가 자극적이었다

"Survey","RD","GarrysMDs","NigelsMDs","PaulsMDs","StephensMDs","BrinleyJ","CarolineP","DaveL","GrantR","GregS","Kent","NeilC","NicolaP","AndyC","DarrenS","DeanB","KarenF","PaulR","RichardF","SteveG","BrianG","GordonA","NickD","NickR","NickT","RayL","SimonH","EdmondH","JasonF","MikeS","SamanthaN","TimB","TravisF","AlanS","Q1","Q2","Q3","Q4","Q5","Q6","Q7","Q8PM","Q8N","Q9","Q10","Q11","Q12","Q13","Q14","Q15","Q16PM","Q16N","Q17PM","Q17N","Q18PM","Q18N","Q19","Q20","Q21","Q22","comment","Q23.1","Q23.2","Q23.3","TQ23.1","TQ23.2","VPM","VN","VQ1","VQ2","VQ3","VQ4","VQ5","VQ6","VQ7","VQ8N","VQ8PM","VQ9","VQ10","VQ11","VQ12","VQ13","VQ14","VQ15","VQ16","VQ16N","VQ16PM","VQ17","VQ17N","VQ17PM","VQ18","VQ18N","VQ18PM","VQ19","VQ20","VQ21","VQ22","VQ23.1","VQ23.2","VQ23.3","VRD","XQ16","XQ17","XQ18" 
+0

오류는 무엇입니까? –

+0

그것은 1 번 줄입니다. 지금 질문에 추가하겠습니다. – PaReeOhNos

+0

어떻게 diff합니까? 만약 파싱에 실패하고 다른 파싱이 실패한다면 두 사람 사이에 차이가 있어야합니다. 'diff'를 실행하지 말고'cmp'를 실행하십시오. 정확한 바이트 차이를 잡을 것입니다. – Casper

답변

4

음은 (는 0에서 인덱스를하지 않는 가정)는 라인 1 라인 1에 말한다!

파일에 CSV 파서가 중단되는 BOM이 있습니다. 파일로드 중

CSV.open("path/to/file.csv", "rb:bom|encoding") 

파일을 완벽하게 구문 분석 할 수있었습니다. 그래서 추적하는데 얼마나 오랜 시간이 걸렸지 만 이제는 작동 중이고 UTF-8로 변환 할 필요가 없습니다!

+0

Oh dear :) 당신이 그것을 알아 낸 것을 잘 알고 있습니다 : http://en.wikipedia.org/wiki/Byte_order_mark. 당신은 당신이 당신 자신의 대답을 받아 들일 수 있다는 것을 압니다. – Casper