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

use*_*144 10 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
Run Code Online (Sandbox Code Playgroud)

拆分删除";" 从SQL结束.有没有办法不删除";" 仍然使用";"拆分.

And*_*all 13

是的,scan它:

'a; b; c;'.scan(/[^;]*;/)
#=> ["a;", " b;", " c;"]
Run Code Online (Sandbox Code Playgroud)

你可以通过坚持下去来消除多余的空白map(&:strip),但这里可能不需要它.

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


小智 8

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

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

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

"a;b;c".split(/(;)/) # => ["a", ";", "b", ";", "c"]
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 5

使用带有回溯的正则表达式

split(/(?<=;)/)
Run Code Online (Sandbox Code Playgroud)


use*_*144 4

这有效:

@sql_stmts_array = File.read(@sql_file).lines(separator=';')
Run Code Online (Sandbox Code Playgroud)

  • `lines(separator=';')` 的语法是错误的 - 可以工作,但写得不好。它应该是 `lines(';')` 。但是,请使用 File.readlines(@sql_file, ';')` 代替,因为它更短并且可以完成相同的事情。 (2认同)