导入每一行时如何同时转义 " 和 '



我导入一个文本文件并将每一行另存为新记录:

CSV.foreach(csv_file_path) do |row|
  # saving each row to a new record
end

奇怪的是,以下内容转义了双引号,但我不知道如何转义不同的字符:

CSV.foreach(csv_file_path, {quote_char: """}) do |row|

如何同时"'转义角色?

请注意,您还有其他选项可用于配置 CSV 处理程序。 用于指定字符分隔符处理的有用选项如下:

  • :col_sep - 定义列分隔符
  • :row_sep - 定义行分隔符
  • :quote_char - 定义引号分隔符

现在,对于传统的 CSV(逗号分隔(文件,这些值默认为 { col_sep: ",", row_sep: "n", quote_char: """ } 。 这些将满足许多需求,但不一定全部。 您可以指定正确的集以满足格式良好的 CSV 需求。

但是,对于非标准 CSV 输入,请考虑使用两次传递方法来读取 CSV 文件。 我对房地产MLS系统中的CSV文件做了很多工作,它们基本上都以某种基本方式损坏。 我使用了各种预处理和后处理方法来解决问题,并且在使用默认选项无法处理的文件方面取得了相当大的成功。

在将单引号

作为分隔符处理的情况下,您可以在使用标准双引号分析文件后去除前导和尾随单引号。 如果单引号的使用方式与双引号相同,则迭代值并使用 gsub 替换可能会正常工作。

还有一个"自动"转换器,CSV 解析器在尝试检索单个列的值时将使用它。 您可以指定 : 转换器选项,如下所示: { converters: [:my_converter] }

编写转换器非常简单,它只是一个小函数,用于检查列值是否与正确的格式匹配,然后返回重新格式化的值。 下面是一个应该去掉前导和尾随单引号的方法:

CSV::Converters[:strip_surrounding_single_quotes] = lambda do |field|
    return nil if field.nil?
    match = field ~= /^'([^']*)'$/
    return match.nil? ? field : match[1]        
end
CSV.parse(input, { converters: [:strip_surrounding_single_quotes] }

您可以使用任意数量的转换器,并按您指定的顺序评估它们。 例如,要将预定义的 :all 与自定义转换器一起使用,您可以这样编写:

CSV.parse(input, { converters: [:all, :strip_surrounding_single_quotes] }

如果有要测试的输入数据示例,我们可能会找到一个完整的解决方案。

一般来说,你不能,因为这会创建一个类似CSV的记录,而不是标准的CSV(维基百科的规则格式更容易阅读(。在 CSV 中,只有双引号被转义 - 通过加倍,而不是使用反斜杠。

尝试编写的不是CSV;你不应该使用CSV库来做到这一点。

最新更新