Разделить строку без удаления разделителя

Мне нужно проанализировать файл, чтобы получить отдельные инструкции SQL и запустить их из контроллера rails.

У меня есть следующий код:

@sql_file = "#{RAILS_ROOT}/lib/evidence_interface_import.sql"   
@sql_stmts_array = File.read(@sql_file).split(";")  

@sql_stmts_array.each_with_index do |sql_stmt,s_index|
   ActiveRecord::Base.connection.execute(sql_stmt)
end

Разделение удаляет ";" с конца SQL. Есть ли способ не удалять ";" и все еще разделить с помощью ";" .

Ответ 1

Это работает:

@sql_stmts_array = File.read(@sql_file).lines(separator=';')

Ответ 2

Yup, scan it:

'a; b; c;'.scan(/[^;]*;/)
#=> ["a;", " b;", " c;"]

Вы можете избавиться от лишнего пробела, нажав на map(&:strip) после, но он, вероятно, здесь не нужен.

Обратите внимание, что это очень рудиментарно, и что-то вроде строкового литерала в SQL с точкой с запятой в нем сломает это. (Например, select * from stuff where name = ";";.)

Ответ 3

При использовании ActiveRecord::Base.connection.execute вам не нужно включать точку с запятой в первую очередь.

Кроме того, другим способом разделения без удаления разделителя является использование групп, как показано в следующем примере:

"a;b;c".split(/;/)   # => ["a", "b", "c"]

"a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"]

Ответ 4

Используйте регулярное выражение с lookbehind

split(/(?<=;)/)

Ответ 5

Вы можете попробовать использовать scan с соответствующим регулярным выражением, которое должно дать вам результаты, похожие на split, но если вы хотите придерживаться способа без регулярного выражения, вы можете просто добавить полуточку в каждую ячейку в массив:

@sql_stmts_array = File.read(@sql_file).split(";").each do |s|
  s << ";"
end