在 Ruby 中使用 gsub 在双引号之间插入白色 space

Insert white space between double quotation marks using gsub in Ruby

我有一个 CSV 文件,其中的列应该是空字符串而不是 null。不幸的是,当我尝试将带有空字符串的 CSV 导入到我的 oracle 数据库中时,例如:

3,3,"","","",f,f

我收到错误消息:

ORA-01400: cannot insert NULL into...

我明白了,因为列设置为不接受 null 而是一个空字符串,并且由于某些奇怪的原因,没有白色的引号 space 被 oracle 解释为 nulll 在阅读 CSV 文件时。

我的想法是使用 gsub 遍历 CSV 文件并在出现的地方添加一个白色 space

,"",

所以它看起来像下面这样:

3,3," "," "," ",f,f

当我通过在引号之间手动添加 spaces 并导入到数据库中进行测试时,这似乎有效。我尝试将其自动化,因为我有 40 多个 CSV 文件。到目前为止我有:

def csv_replace_empty_string
  Dir.foreach(Rails.root.join('db', 'csv_export')) do |filename|
    next if filename == '.' or filename == '..' or filename == 'extract_db_into_csv.sh' or filename =='import_csv.rb'
    read_file = File.read(Rails.root.join('db', 'csv_export', filename))
    replace_empty_string = read_file.gsub(/,"",/, '," ",')
    File.open(Rails.root.join('db', 'csv_export', filename), "w") {|file| file.puts replace_empty_string }
  end
end

但这只会替换文件中每一行中的第一次出现。

是否有更好更有效的方法来遍历目录并在 CSV 文件中每次出现的双引号之间插入白色 space?

您需要匹配字符串或双引号 start/end 处的位置。

你可以使用

replace_empty_string = read_file.gsub(/(?<![^,])""(?![^,])/, '" "')

参见regex demo

详情

  • (?<![^,]) -(与 (?<=\A|,) 相同)- 字符串开头或紧跟逗号
  • 的位置
  • "" - 两个 " 个字符
  • (?![^,]) -(与 (?=\z|,) 相同)- 字符串末尾或紧跟逗号的位置。