3

CSV ファイルの解析で問題が発生しており、しばらくの間これを解決できません。パイプで区切られた CSV ファイルには、解析に失敗する特殊なケースがあります。これが私のコードです:

CSV.parse(data, {:headers => true, :header_converters => [:symbol, :downcase], :col_sep => '|'}).each do |row|
   if row[:name]
      counter += 1
   end

生成されるケースは次のMessage: Illegal quoting in line 2とおりです。

|test "Some quoted name"|2|12|Machine|

しかし、これは機能し、他のケースは機能します:

|"Some quoted name"|2|12|Machine|

どうすればこれを通過できますか?

4

2 に答える 2

4

そのメッセージは技術的に正しいです。引用符は、CSV 形式に対して特別な意味を持ちます。引用符を使用すると、データに区切り文字を埋め込むことができます。したがって、フィールド内で使用される引用符は、それらがデータの一部である場合はエスケープする必要があります。または、CSV パーサーに、引用符に他の文字を使用するよう通知する必要があり"ます。

各フィールド内で実際にパイプをサポートする必要がなく、この問題を回避できる未使用の文字が他にある場合は、Ruby の CSV を作成して、(わずかに) 不正な形式の csv 形式を使用することができます。

CSV.parse(data, {:col_sep => '|', :quote_char => "%" })

それ以外の場合、問題行の正しい引用は

|"Some ""quoted name"""|2|12|Machine|
于 2013-05-23T11:27:40.337 に答える
1

エラーの理由は、行が不正な形式の CSV であることです。ここを見てください、それは言います:

埋め込まれた二重引用符はそれぞれ、二重引用符のペアで表す必要があります。

1997,Ford,E350,"Super, ""luxurious"" truck"
  • 改行、二重引用符、および/またはコンマを含むフィールドは引用符で囲む必要があります。(そうでない場合、ファイルを正しく処理できない可能性があります)。

それを念頭に置いて、次のように動作します。

CSV.parse('|test "Some quoted name"|2|12|Machine|', {:col_sep => '|', :quote_char => "'"}).each do |row|
   pp row
end
# => [nil, "test \"Some quoted name\"", "2", "12", "Machine", nil]
于 2013-05-23T11:36:45.733 に答える