Вставьте пробел между двойными кавычками с помощью gsub в Ruby

#ruby-on-rails #ruby #string #csv #gsub

Вопрос:

У меня есть CSV-файл, в котором столбцы должны быть пустыми строками, а не пустыми. К сожалению, когда я пытаюсь импортировать 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?

Ответ №1:

Вам нужно сопоставить местоположения, которые находятся в начале/конце строки или в двойных кавычках.

Вы можете использовать

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

Смотрите демонстрацию регулярных выражений.

Подробные сведения

  • (?<![^,]) — (то же, (?<=A|,) что ) — расположение в начале строки или непосредственно перед запятой
  • "" — два " символа
  • (?![^,]) — (то же, (?=z|,) что ) — место в конце строки или сразу после запятой.

Комментарии:

1. Это прекрасно! Это также работает в том случае, когда у меня есть что-то вроде: 9,10,7,," "," "," ",f,f"" . Это не добавляет пробел к заключительным кавычкам с символом перед! Большое вам спасибо, это именно то, чего я хотел.

2. @Naj Правильно, это не добавит никакого места ,f"" в конце, потому , что непосредственно перед этим его нет "" .

3. готово, извините, что я в первый раз задаю вопрос, не был уверен, как его принять 🙂