【问题标题】:Loop and strings in Ruby/SQLite3Ruby/SQLite3 中的循环和字符串
【发布时间】:2011-03-23 00:38:08
【问题描述】:

所以我需要在 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(",")",但在那之后我真的不知道很多其他的循环方式。

谢谢, 鲍比

【问题讨论】:

    标签: ruby-on-rails ruby rubygems sqlite


    【解决方案1】:

    我想你正在寻找这个:

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

    或者这个:

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

    【讨论】:

    • 我错过了他的 id 最初存储为 csv 字符串。
    • 我得到“rubysql.rb:12: private method `split' called for ["prideID"]:SQLite3::ResultSet::ArrayWithTypesAndFields (NoMethodError)”如果我把它放在我的代码中。知道为什么吗?谢谢!
    • 我没有使用过 SQLite。尝试写 i.first 或 i.fields。
    • Bobby:您必须将数据库输出结果作为散列。我用一个例子更新了我的答案。我从来没有直接使用过 SQLite(只有 ActiveRecord),所以我从sqlite-ruby.rubyforge.org/sqlite3/faq.html 拼凑了这个例子
    【解决方案2】:

    使用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"
    

    编辑2: 如果你希望你的值是一个字符串,例如,""1643"、"3"",那么你必须执行以下操作:

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

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多