如何在导入每一行时同时“和”

时间:2015-10-22 06:54:40

标签: ruby csv

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

$.post( "<?php echo str_replace('www.', '', base_url());?>+home/latestnew", {  page: page })
        .done(function( data ) {
            $("#pag_data").html( data );
    });

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

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

如何同时转义字符CSV.foreach(csv_file_path, {quote_char: "\""}) do |row| "

2 个答案:

答案 0 :(得分:1)

一般情况下,您不能,因为这将创建一个类似CSV的记录,而不是standard CSV(维基百科有the rules更容易阅读的格式)。在CSV中,只有双引号被转义 - 通过加倍,而不是使用反斜杠。

您要写的不是CSV;您不应该使用CSV库来执行此操作。

答案 1 :(得分:1)

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

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

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

但是,对于非标准CSV输入,请考虑使用两遍方法来读取CSV文件。我已经用Real Estate MLS系统的CSV文件做了很多工作,而且它们基本上都是以某种基本方式打破的。我已经使用各种预处理和后处理方法来解决问题,并且使用默认选项无法处理的文件取得了很大的成功。

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

在尝试检索单个列的值时,CSV解析器还会使用“自动”转换器。您可以指定:converter选项,如下所示:{ 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] }

您可以根据需要使用任意数量的转换器,并按照您指定的顺序对其进行评估。例如,要使用预定义的:以及自定义转换器,您可以这样写:

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

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