4

何らかの理由で、csv ファイルに「不正な引用」エラーのある行がいくつか含まれています。

1336481227,178.108.171.183,3.2.0,9700132ccc02e12a,c083b5d2-ec92-486f-a5b3-512dba1ce4ae,invoke_action,"{""タイムスタンプ"":""2012-05-08 13:47:26""}"

1336481227,178.108.171.183,3.2.0,9700132ccc02e12a,c083b5d2-ec92-486f-a5b3-512dba1ce4ae,invoke_action,{""タイムスタンプ"":""2012-05-08 13:47:27"}

最初の行は正しいです。しかし、2 行目の最後のフィールド {""timestamp"":""2012-05-08 13:47:27""} には、中括弧の外側の二重引用符がありません。

CSV.foreach(csv_file_path) do |row|
    puts "======================="
    puts row
    puts "======================="
end

エラーが発生しました

=======================
1336481227
178.108.171.183
3.2.0
9700132ccc02e12a
c083b5d2-ec92-486f-a5b3-512dba1ce4ae
invoke_action
{"timestamp":"2012-05-08 13:47:26","a":"b"}
=======================
#<CSV::MalformedCSVError: Illegal quoting in line 2.>

とにかく、この行をそのような問題で修正したり、エラーが発生したときにスキップしたりできますか?

編集済み:試してみると

CSV.foreach(csv_file_path, :quote_char => "\'") do |row|
    puts "======================="
    puts row
    puts "======================="
end

ただし、最初の行の JSON 形式の値は壊れています。

=======================
1336481227
178.108.171.183
3.2.0
9700132ccc02e12a
c083b5d2-ec92-486f-a5b3-512dba1ce4ae
invoke_action
"{""timestamp"":""2012-05-08 13:47:26""
""a"":""b""}"
=======================
=======================
1336481227
178.108.171.183
3.2.0
9700132ccc02e12a
c083b5d2-ec92-486f-a5b3-512dba1ce4ae
invoke_action
{""timestamp"":""2012-05-08 13:47:27""}
=======================
4

2 に答える 2

3

試す

CSV.foreach(csv_file_path, :quote_char => "\'")
于 2012-05-15T05:47:27.150 に答える
0

最も簡単な方法は、ダブルgsubを使用することだと思います

require 'csv'
line = "1336481227,178.108.171.183,3.2.0,9700132ccc02e12a,c083b5d2-ec92-486f-a5b3-512dba1ce4ae,invoke_action,\"{\"\"timestamp\"\":\"\"2012-05-08 13:47:26\"\",\"\"a\"\":\"\"b\"\"}\""
line.gsub!('""', '%tmp%')
csv = CSV.new(line).each.map do |line|
  line.map do |value|
    value.gsub!('%tmp%', '""')
    value
  end
end

puts csv.inspect
# => [["1336481227", "178.108.171.183", "3.2.0", "9700132ccc02e12a", "c083b5d2-ec92-486f-a5b3-512dba1ce4ae", "invoke_action", "{\"\"timestamp\"\":\"\"2012-05-08 13:47:26\"\",\"\"a\"\":\"\"b\"\"}"]]
于 2012-05-15T08:14:55.053 に答える