11

我需要解析一个文件以获取单个 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 的末尾开始。有没有办法不删除“;” 并且仍然使用“;”分割。

4

5 回答 5

16

是的,scan它:

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

您可以通过在之后添加来消除多余的空白map(&:strip),但这里可能不需要它。

请注意,这是非常基本的,并且类似于 SQL 中带有分号的字符串文字会破坏它。(例如select * from stuff where name = ";";。)

于 2012-09-22T01:03:00.157 回答
9

使用时,ActiveRecord::Base.connection.execute您不需要首先包含分号。

此外,另一种在不删除分隔符的情况下进行拆分的方法是使用组,如下例所示:

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

"a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"]
于 2014-06-24T08:51:33.537 回答
6

使用带有后视功能的正则表达式

split(/(?<=;)/)
于 2012-09-22T02:53:50.310 回答
4

这有效:

@sql_stmts_array = File.read(@sql_file).lines(separator=';')
于 2012-10-11T20:04:36.457 回答
1

您可以尝试使用scan适当的正则表达式,它应该会给您类似的结果split,但如果您想坚持不使用正则表达式的方式,您可以在数组中的每个单元格中附加一个分号:

@sql_stmts_array = File.read(@sql_file).split(";").each do |s|
  s << ";"
end
于 2012-09-22T00:46:20.250 回答