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