[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の配列、ハッシュでデータベースっぽく
|データベースを使うほどのことでもない時に配列・ハッシュでできればなと
リレーション
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