Rubyの魔神 このページをアンテナに追加 RSSフィード

   「Ruby」は宝石の魔神のイメージ(The Jinn of the Ruby)
   [VB] [VB6] [Android] [電子工作] [個人メモ] [仕事メモ] [アイデア] [TstLink] [開発] [CE] [LTSA] [自動化] [Qt] [OCaml] [TOOLS]
   [RubyForge] [RAA] [Forge]   [機能別索引] [逆引きRuby] [マニュアル] [るびま] [標準ライブラリ] [るりまサーチ] [Try! Ruby] [PRaggerまとめ] [ピジョン・ブラッド]
   [Rubyコーディング規約] [プログラミングのオキテ] [Rubyist SNS] [TOOLBIS]
   [RubyネットワークProg] [druby] [コードなにがし] [RDocテンプレ] [Ruby/Tkサンプル]
   [WAVE] [Xperia] [github] [twitterなど] [Java] [EA] [マクロ]

2007-11-03

rubyの配列、ハッシュでデータベースっぽく

13:52 | rubyの配列、ハッシュでデータベースっぽく - Rubyの魔神 を含むブックマーク はてなブックマーク - rubyの配列、ハッシュでデータベースっぽく - Rubyの魔神 rubyの配列、ハッシュでデータベースっぽく - Rubyの魔神 のブックマークコメント

データベースを使うほどのことでもない時に配列・ハッシュでできればなと

リレーション

table1={"1"=>["foo",18],"2"=>["bar",25]}
table2=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]
table3 = table2.map{|v| v + table1[v[1]]}
p table3

追加

最初に追加

a=[[1,1,1],[2,2,2]]
a.push([3,3,3])
a << [4,4,4]
p a

最後に追加

a=[[1,1,1],[2,2,2]]
a.unshift([3,3,3])
p a

途中に挿入

a=[[1,1,1],[2,2,2],[5,5,5]]
a[2,0]=[[3,3,3],[4,4,4]]
p a

取りだし

最初から順番に1レコード取り出し(元のテーブルからも削除)

a=[[1,1,1],[2,2,2],[5,5,5]]

while b=a.shift
  p b
end

最後から順番に1レコード取り出し(元のテーブルからも削除)

a=[[1,1,1],[2,2,2],[5,5,5]]

while b=a.pop
  p b
end

指定のフィールドのみ取り出し

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]
table2=table1.map{|a|[a[0],a[2]]}
p table2

条件に合うレコードの取り出し

a=[[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5]]
b = a.select{|d| d[1] > 2 and d[1] < 5}
p b

指定のフィールドでソート

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]
a=table1.sort{|a,b|a[2]<=>b[2]}
p a

複数のテーブルをレコード単位で1レコードづつ処理

table1=[[1,"a"],[2,"b"],[3,"c"]]
table2=[["x",""],["y",""],["z",""]]
table3=[["A","Z"],["B","Y"],["C","X"]]

table123=table1.zip(table2,table3)

table123.each{|a,b,c|
  puts  a[1] + b[0] + c[1]
}

指定のフィールドでレコードの重複を無くす

最初に出たレコードのみ残るので必要に応じて事前にソートするといい

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]

table2=[]
table1.each{|i|
  table2 << i
  table1.delete_if{|j|j[0]==i[0]}
}
p table2

重複したレコードの抽出

2回目以降に出たレコードのみ残るので必要に応じて事前にソートするといい

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]

table2=[]
while i = table1.shift
  table2 += table1.select{|j|j[0]==i[0]}
end

p  table2

重複削除

a=[6,4,3,5,6,7,1,2,3,6,5,3,2,3,1,3]
b=a.uniq
p b

重複した数を数える

a=[6,4,3,5,6,7,1,2,3,6,5,3,2,3,1,3]
c={}
c.default=0
a.each{|b| c[b] += 1}
p c.to_a

特定のデータを削除

a=[6,4,3,5,6,7,1,2,3,6,5,3,2,3,1,3]
a.delete(3)
p a

条件に合ったレコードを削除

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]
a=table1.delete_if{|d| d[2]==1}
p a

指定行の位置のレコードを削除

table1=[["2007-11-2","1",3],["2007-11-2","2",1],["2007-11-3","2",4],["2007-11-3","2",2]]
p a = table1.delete_at(1)
p table1

クロス集計

table1=[["11-1","A"],["11-1","B"],["11-1","C"],["11-2","A"],["11-2","A"],["11-2","A"],["11-2","B"],["11-2","C"],["11-2","C"],["11-3","B"],["11-5","C"],["11-5","B"],["11-5","B"],["11-6","A"],["11-6","A"],["11-6","B"],["11-6","B"],["11-6","C"],["11-6","C"]]

xt=table1.map{|a|a[1]}.uniq
yt=table1.map{|a|a[0]}.uniq

table2=[[""]+xt]
yt.each{|y|
  x1=[y]
  xt.each{|x|
    x1 << table1.select{|d|d[0] == y and d[1] == x}.size
  }
  table2 << x1  
}

p table2

トラックバック - http://ruby.g.hatena.ne.jp/garyo/20071103