1

現在、レールでいくつかの CSV を解析しようとして深刻な問題が発生しています。基本的に、私のアプリはユーザーに CSV ファイルをアップロードさせます。次に、アプリはファイルを変換して UTF-8 形式であることを確認し、解析して処理しようとします。ただし、アプリがそれを解析しようとするたびに、「行 1 での不正な引用」という MalformedCSVError が表示されます。

元のファイルを新しいドキュメントにコピーして保存すると、Railsコンソールで問題なく解析できます。

元のファイルを解析しようとすると、UTF-8 エンコーディングでは無効な文字であるというメッセージが表示されます (ファイルが UTF-8 ではないため、アプリによって変換されます)。

アプリが UTF-8 に変換し、行末を LF に変更したファイルを解析しようとすると、解析に失敗します。

アプリが生成したバージョンと、私が作成したコピー/貼り付けバージョン (これは機能します) との間でファイルの差分を作成すると、違いが 0 になるため、なぜ 1 つが解析可能で、1 つが解析可能でないのかを理解できません。

助言がありますか?私のアプリは次のようにファイルを処理しています:

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)

終わり

ファイルをアップロードするgemは、違いがある場合はCarrierWaveです。

これは私を狂わせているので、誰かが私を助けてください!

編集

エラーは、それが1行目にあることを示しています.1行目(0からインデックス付けされていないと仮定)は

"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"
4

1 に答える 1

4

それはイライラしました!

ファイルに BOM が含まれていたため、CSV パーサーが壊れていたことが判明しました。でファイルをロードする

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

完全に解析できました!追跡するのにどれだけ時間がかかったのかイライラしましたが、現在は機能しており、UTF-8 に変換する必要もありません!

于 2013-01-12T02:05:31.097 に答える