如何处理每行被双引号包裹的Ruby CSV文件?
问题:Ruby如何正确解析每行被双引号包裹的CSV文件?
客户发来的CSV文件每行都被双引号包裹,示例如下:
"example, header, values " "example, first, line " "example, second, line " ... "etc, etc, etc "
这导致Ruby将每行(包括表头)解析为单个字段,直接引发数据导入脚本崩溃。
当前代码逻辑是通过File对象打开文件,传入带配置项的CSV.foreach枚举器处理:
CSV.foreach(<File Object>, <Options Hash>).with_index(1) do |line, index| # process a record end
有没有简便方法让Ruby忽略这些引号,正确解析各个字段?
我曾尝试将CSV配置中的quote_char改为单引号,结果问题更严重;也可以通过预处理移除文件中的引号,但需要修改大量遗留代码,希望能避免。查阅Ruby CSV文档后未找到明确解决方案。
当前使用的CSV配置如下:
{ headers: true, skip_blanks: true, encoding: 'bom|utf-8', liberal_parsing: true, header_converters: lambda { |f| f.downcase.strip }, row_sep: "\n", quote_char: "'" }
解决方案
方案一:调整CSV解析配置
如果你的CSV每个记录是被双引号包裹且换行符包含在引号内(即每个记录的格式为"内容\n"),可以修改配置中的quote_char为双引号,并调整row_sep为"\n\"",让解析器正确识别记录边界:
{ headers: true, skip_blanks: true, encoding: 'bom|utf-8', liberal_parsing: true, header_converters: lambda { |f| f.downcase.strip }, row_sep: "\n\"", quote_char: '"' }
方案二:轻量包装文件内容(最小改动遗留代码)
如果不想调整解析逻辑,可通过枚举器包装文件内容,自动去掉每行首尾的双引号,后续处理代码完全不需要修改:
# 替换原有File对象初始化代码 file_path = "<你的文件路径>" processed_io = Enumerator.new do |yielder| File.open(file_path, 'r:bom|utf-8') do |file| file.each_line do |line| # 移除每行首尾的双引号,保留换行符保证解析器正常识别行 cleaned_line = line.gsub(/^"|"$/, '') yielder << cleaned_line end end end # 原有处理逻辑保持不变 CSV.foreach(processed_io, <Options Hash>).with_index(1) do |line, index| # process a record end
内容的提问来源于stack exchange,提问作者josenecal
相关产品推荐
相关产品推荐

