我需要解析一个文件以获取单个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结束。有没有办法不删除&#34 ;;"并且仍然使用";"。
分开答案 0 :(得分:13)
是的,scan
它:
'a; b; c;'.scan(/[^;]*;/)
#=> ["a;", " b;", " c;"]
你可以通过在map(&:strip)
之后添加来消除多余的空白,但这里可能不需要它。
请注意,这是非常基本的,类似于SQL中带有分号的字符串文字会破坏这一点。 (例如select * from stuff where name = ";";
。)
答案 1 :(得分:8)
使用ActiveRecord::Base.connection.execute
时,您不需要首先包含分号。
另外,在不删除分隔符的情况下拆分的另一种方法是使用组,如以下示例所示:
"a;b;c".split(/;/) # => ["a", "b", "c"]
"a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"]
答案 2 :(得分:4)
使用带有lookbehind的正则表达式
split(/(?<=;)/)
答案 3 :(得分:4)
这有效:
@sql_stmts_array = File.read(@sql_file).lines(separator=';')
答案 4 :(得分:1)
您可以尝试将scan
与适当的正则表达式一起使用,这应该会给您类似split
的结果,但是如果您想坚持使用没有正则表达式的方法,您可以只添加一个分号到阵列中的每个单元格:
@sql_stmts_array = File.read(@sql_file).split(";").each do |s|
s << ";"
end