2012-09-22 67 views
10

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

回答

3

这个工程正则表达式(例如,select * from stuff where name = ";";):

@sql_stmts_array = File.read(@sql_file).lines(separator=';') 
+1

'lines(separator =';')''的语法是错误的 - 这样可以工作,但写得不好。它应该是'lines(';')'而不是。但是,应该使用'File.readlines(@sql_file,';')',因为它更短,并且完成同样的事情。 –

1

你可以尝试使用scan用适当的正则表达式,这应该给你的结果与split,但如果你想坚持没有正则表达式的方式,你可以追加一个分号到阵列中的每个单元:

@sql_stmts_array = File.read(@sql_file).split(";").each do |s| 
    s << ";" 
end 
+2

这具有把一个分号的最后一个条目之后的副作用。 – willglynn

+1

这不是那个想要的吗?每次进入后都不应该有';'? – siame

13

是啊,scan它:

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

您可以通过后会附上map(&:strip)摆脱多余的空白,但它可能不会在这里需要的。

请注意,这是非常基本的东西,像SQL中的字符串文字和分号在它将打破这一点。

+1

一个类似的选项是:''a; b; c。'scan(/.*?;/)' – Sajjad

3

使用了回顾后

split(/(?<=;)/) 
6

当使用ActiveRecord::Base.connection.execute你没有需要在首位的分号。

此外,另一种方法不去除定界符拆分是使用基团中所示的下面的例子:

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

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

对于许多涉及标记和字符串操作的情况 - 这是一个很好的解决方案。 –

+0

我会将此标记为接受的答案。扫描似乎需要每个项目之后的分隔符,而不仅仅是在它们之间。 –