【问题标题】:How to find and replace element in CSV [closed]如何在 CSV 中查找和替换元素 [关闭]
【发布时间】:2014-11-21 17:25:16
【问题描述】:

在下面的 CSV 文件示例中,如何查找和替换诸如 "West" 周围的引号之类的模式?

"LastName","FirstName","","","890","","6G","","S "West" AVENUE","","CITY","ZIP"

【问题讨论】:

  • 这是什么输出:CSV.foreach('your_file.csv') do |row| p row end 你可以只发布前几行。
  • 我们需要知道你尝试了什么。
  • 我尝试使用 csv.grep(/("[a-zA-Z]")/) 来识别早期的示例,但这只适用于中间的一个字符。
  • 输出不会运行,因为错误提示第 1 行引用错误

标签: ruby parsing csv


【解决方案1】:

您不能使用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 规范的规则,并在字符串周围使用双引号。

【讨论】:

  • 好答案。我特别喜欢你的第二句话。事实上,这是许多问题的根源,不仅在编码方面,而且在整个生活中。
  • 哈哈。谢谢。就当我看到的那样称呼它。而且我已经看过太多次了。
  • 真棒答案!谢谢!它现在似乎工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2012-05-13
  • 2011-02-04
  • 1970-01-01
  • 2019-08-02
  • 2019-02-20
相关资源
最近更新 更多