2012-09-22 103 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

我會將此標記爲接受的答案。掃描似乎需要每個項目之後的分隔符,而不僅僅是在它們之間。 –