You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby如何用gsub处理CSV空双引号解决Oracle导入ORA-01400错误

解决方案

失效根因

你现有代码的正则/,"",/匹配时会消耗空引号前后的逗号,遇到,"","",""这类连续空引号场景时,第一个匹配占用了第一个空引号后的逗号,后续空引号缺少前置逗号无法命中,因此只能替换每行第一个匹配项。

优化实现(全量替换)

def csv_replace_empty_string
  csv_dir = Rails.root.join('db', 'csv_export')
  # 仅匹配CSV文件,无需手动排除非目标文件
  Dir.glob(File.join(csv_dir, '*.csv')) do |csv_path|
    file_content = File.read(csv_path)
    # 零宽断言匹配所有空双引号,不消耗前后分隔符/行首尾标识
    processed_content = file_content.gsub(/(?<=,|^)""(?=,|$)/, '" "')
    File.write(csv_path, processed_content)
  end
end

改进点

  • 正则支持匹配所有场景的空双引号:行首空引号、行尾空引号、连续空引号
  • 自动过滤非CSV文件,避免误改目录下的脚本文件
  • 逻辑和原方案性能持平,单遍扫描即可完成全量替换

超大文件兼容方案

如果单CSV文件超过可用内存,可使用逐行流式处理,内存占用稳定可控:

def csv_replace_empty_string_stream
  require 'tempfile'
  require 'fileutils'
  csv_dir = Rails.root.join('db', 'csv_export')
  Dir.glob(File.join(csv_dir, '*.csv')) do |csv_path|
    temp = Tempfile.new('csv_process')
    File.foreach(csv_path) do |line|
      temp.puts line.gsub(/(?<=,|^)""(?=,|$)/, '" "')
    end
    temp.close
    FileUtils.mv(temp.path, csv_path)
  end
end

内容的提问来源于stack exchange,提问作者Pro_grammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:39:04