我有一个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|,)
相同)-位于字符串末尾或紧接逗号的位置。