拆分字符串而不删除分隔符

时间:2012-09-22 00:25:12

标签: ruby ruby-on-rails-3

我需要解析一个文件以获取单个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 ;;"并且仍然使用";"。

分开

5 个答案:

答案 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