2010-07-30 88 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