Цикл и строки в Ruby / SQLite3 - PullRequest
0 голосов
/ 30 июля 2010

Так что мне нужно запустить цикл в Ruby для передачи некоторых строк в SQLite. В основном у меня есть таблица, которая выглядит так:

    pID          Data
1649,1650,1651|Some data
1643,3|some more data
23,4,5,6,7|More data

Теперь в моих SQLite-запросах мне иногда нужно будет передать все pID для данной строки как одну целую строку, что я легко могу сделать с помощью переменной 'i' в цикле ниже:

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 (", ")", но после этого я действительно не знаю многого другого.

Спасибо, Бобби

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Я думаю, вы ищете это:

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

Или это:

i.gsub(/[0-9]+/, '"\0"')
0 голосов
/ 30 июля 2010

Используйте 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\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...