我导入一个文本文件并将每一行保存为新记录:
$.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|
和"
?
答案 0 :(得分:1)
一般情况下,您不能,因为这将创建一个类似CSV的记录,而不是standard CSV(维基百科有the rules更容易阅读的格式)。在CSV中,只有双引号被转义 - 通过加倍,而不是使用反斜杠。
您要写的不是CSV;您不应该使用CSV库来执行此操作。
答案 1 :(得分:1)
请注意,您还可以使用其他选项来配置CSV处理程序。指定字符分隔符处理的有用选项如下:
现在,对于传统的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] }
如果有一个要测试的输入数据的示例,我们可能会找到一个完整的解决方案。