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
相关产品推荐
相关产品推荐

