您不能使用the CSV class 来阅读此内容,因为它是格式错误的 CSV 字符串。有时会发生这种情况,因为生成它的人不知道他们在做什么:
require 'csv'
foo = '"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"'
arr_of_arrs = CSV.parse(foo)
然后导致异常:
Missing or stray quote in line 1 (CSV::MalformedCSVError)
相反,要处理这个问题,您必须修复数据,然后进行解析。这是一个起点:
/(?<=\s)("[^"]+")(?=\s)/
http://rubular.com/r/sWEkx07Zyo
该模式在引号之间寻找一些东西,用前导和尾随空格包裹。未捕获空格。
下面是一些适用于这个特定示例的代码:
foo = '"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"'
REGEX = /(?<=\s)("[^"]+")(?=\s)/
word = foo[REGEX]
foo[REGEX] = word[1..-2]
puts foo
# >> "LastName","FirstName","","","890","","6G","","S West AVENUE","","CITY","ZIP"
此时可以使用 CSV:
require 'csv'
arr_of_arrs = CSV.parse(foo)
# => [["LastName",
# "FirstName",
# "",
# "",
# "890",
# "",
# "6G",
# "",
# "S West AVENUE",
# "",
# "CITY",
# "ZIP"]]
这些东西可能会让人困惑:
word = foo[REGEX]
foo[REGEX] = word[1..-2]
foo\[...\] is part of the String class,是一种在字符串中查找和替换字符的好方法。
虽然可以让 CSV 解析器对嵌入的引号感到满意,因此如果将它们扔掉过于繁重,您可以执行以下操作:
word = foo[REGEX]
foo[REGEX] = '"%s"' % word
require 'csv'
arr_of_arrs = CSV.parse(foo)
# => [["LastName",
# "FirstName",
# "",
# "",
# "890",
# "",
# "6G",
# "",
# "S \"West\" AVENUE",
# "",
# "CITY",
# "ZIP"]]
这只是遵循 CSV 规范的规则,并在字符串周围使用双引号。