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