【问题标题】:Insert white space between double quotation marks using gsub in Ruby在 Ruby 中使用 gsub 在双引号之间插入空格
【发布时间】:2021-09-14 08:27:17
【问题描述】:

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

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

我收到错误消息:

ORA-01400: cannot insert NULL into...

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

我的想法是使用 gsub 浏览 CSV 文件并在事件中添加一个空格

,"",

使它看起来像下面这样:

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

当我通过在引号之间手动添加空格并导入数据库来测试它时,这似乎有效。我尝试将其自动化,因为我有 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 文件中每次出现的双引号之间插入空格?

【问题讨论】:

    标签: ruby-on-rails ruby string csv gsub


    【解决方案1】:

    您需要匹配位于字符串开头/结尾或双引号的位置。

    你可以使用

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

    请参阅regex demo

    详情

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

    【讨论】:

    • 这太完美了!当我有类似的情况时,它也适用:9,10,7,," "," "," ",f,f""。它不会在前面带有 char 的结尾引号中添加空格!非常感谢,这正是我想要的。
    • @Naj 对,它不会在最后的,f"" 中添加任何空格,因为在"" 之前没有,
    • 完成了,抱歉这是我第一次提出问题,不知道如何接受:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2020-05-05
    • 2019-10-23
    相关资源
    最近更新 更多