2010-07-30 92 views
0

所以我需要在Ruby中運行一個循環來傳遞一些字符串到SQLite中。基本上我有一個表,看起來像這樣:循環和Ruby/SQLite3中的字符串

pID   Data 
1649,1650,1651|Some data 
1643,3|some more data 
23,4,5,6,7|More data 
在我的SQLite查詢

現在,我有時需要通過通過對給定行的所有的PID作爲一個整體字符串,我可以很容易地做到了「我」在下面的循環變量:

pID = db.execute("select distinct pID from pmesh") 
pID.each do |i| 
end 

其中‘I’將等於每個PID線和各串看起來是這樣的:

1649,1650,1651 
1643,3 
23,4,5,6,7 

但有時我需要每個字符串看起來像這樣的我通過他們通過:

"1649","1650","1651" 
"1643","3" 
"23,"4","5","6","7"  

有沒有簡單的循環,我能做到這一點就會把報價和適當的逗號,使串出現,因爲我希望他們?我知道我可以做「i = i.to_s()和a = i.split(」,「)」,但是在那之後我真的不知道其他什麼。

感謝, 鮑比

回答

0

使用Enumerable.collect

下面是一個例子:

x = [1,2,4,5,6] 
=> [1,2,4,5,6] 
x.collect { |i| "#{i}" } 
= > ["1","2","4","5","6"] 

,或者,如果你想將它們連接成一個字符串:

x.collect { |i| "#{i}" }.join(', ') 

,或者,如果你輸入的是一個CSV字符串:

x.split(",").collect { |i| "#{i}" }.join(', ') 

編輯:

這裏是一個我想你想要做的事情的例子。

require 'sqlite3' 
db = SQLite3::Database.new("test.db") 
db.execute("create table bobby (pID varchar2(50), Data varchar(100))") 
db.execute("select * from bobby") 
db.execute("insert into bobby values (? , ?)", "1649,1650,1651", "Some Data1") 
db.execute("insert into bobby values (? , ?)", "1643,3", "Some Data2") 
db.execute("insert into bobby values (? , ?)", "23,4,5,6,7", "Some Data3") 
db.execute("select * from bobby").each do |row| 
    p 
end 
# outputs [["1649,1650,1651", "Some Data1"], ["1643,3", "Some Data2"], ["23,4,5,6,7", "Some Data3"]] 

db.results_as_hash = true #allows hashing row via column name 

puts "Each ID as array of strings" 
db.execute("select * from bobby").each do |row| 
    p row['pID'].split(",").collect { |i| "#{i}" } 
end 

puts "Each ID as single string" 
db.execute("select * from bobby").each do |row| 
    p row['pID'].split(",").collect { |i| "#{i}" }.join(", ") 
end 

這裏是輸出:

C:\Users\Jim\Desktop>ruby sqlLiteExample.rb 
Each ID as array of strings 
["1649", "1650", "1651"] 
["1643", "3"] 
["23", "4", "5", "6", "7"] 
Each ID as single string 
"1649, 1650, 1651" 
"1643, 3" 
"23, 4, 5, 6, 7" 

EDIT2: 如果你想你的價值觀是一個字符串,例如 「」 1643" , 「3」」那麼你會必須做到以下幾點:

x.map{|i| '"' + "#{i}" + '"' }.join(',') 
# outputs "\"124\",\"5525\",\"23525\"" 
2

我認爲你正在尋找這樣的:

i.split(",").map { |x| '"' + x + '"' }.join(",") 

或者這樣:

i.gsub(/[0-9]+/, '"\0"') 
+0

我錯過了他的ids初始存儲爲csv字符串。 – 2010-07-30 00:26:53

+0

如果我把它放在我的代碼中,我得到「rubyql.rb:12:私人方法'分裂'調用[」prideID「]:SQLite3 :: ResultSet :: ArrayWithTypesAndFields(NoMethodError)」「。任何想法爲什麼? 謝謝! – Bobby 2010-07-30 00:28:41

+1

我還沒有用過SQLite。嘗試寫i.first或i.fields。 – 2010-07-30 00:45:27