#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. готово, извините, что я в первый раз задаю вопрос, не был уверен, как его принять 🙂