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



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

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

我得到错误信息:

ORA-01400: cannot insert NULL into...

我得到,因为列被设置为不接受null,而是一个空字符串,由于一些奇怪的原因,引号没有空格被oracle解释为null同时读取CSV。

我的想法是使用gsub来遍历CSV文件,并在

的出现处添加空白。

,"",

让它看起来像下面这样:

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

当我通过手动在引号之间添加空格并导入到db中进行测试时,这似乎是有效的。我尝试自动化这个,因为我有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文件中的每次出现的双引号之间插入空白?

您需要匹配字符串的开始/结束位置或双引号。

可以使用

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

参见regex演示。

细节

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

最新更新