2017-04-06 14 views
0

私は小さい番号の長いリストを持っていますが、すべて< 16ですが、一意のリストには10​​000を超えるものがあります。小さな数字のリストをPostgresに保存するには

は、私は次のように、カンマ区切りリストとして値を取得する:

6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2, .... lots and lots of numbers 

そして最後に、私はリードバックして再度処理するために、最も効率的な方法で、データベース内の値を格納する必要があります。.. 。を文字列として、カンマ区切りの値。

私は大文字のTEXTフィールドにそれらを格納することを考えていましたが、そこにすべてのカンマを追加するとスペースが無駄になります。

このシナリオにはベストプラクティスがあるかどうかは疑問です。

技術的な詳細については

:私はPostgresのを使用する必要があり、データベースのための

(と私は、このフィールドにソート初心者の午前)、およびプログラミング言語は(も初心者:))

+0

で文字列の長さを分割して保存するために、1バイトに2つのヘキサ文字を詰めることができ長いVARCHAR()内のバイト?値を「グループ化」して、1つの文字で複数の値を修正することもできます。もちろん、あなたが宇宙で救うものは、抽出のために複雑さと時間を払うことになります。 (私は答えを見ていない、多分同じか類似mudasobwaの答えです) – etsa

+0

"効率的"。それは速くなければならないか、できるだけ少ないスペースを使用するか? –

答えて

1
numbers = "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2" 

numbers.split(',') 
     .map { |n| n.to_i.to_s(2).rjust(4, '0') } 
     .join 
     .to_i(2) 
     .to_s(36) 
#⇒ "57ymwcgbl1umt2a" 

"57ymwcgbl1umt2a".to_i(36) 
       .to_s(2) 
       .tap { |e| e.prepend('0') until (e.length % 4).zero? } 
       .scan(/.{4}/) 
       .map { |e| e.to_i(2).to_s } 
       .join(',') 
#⇒ "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2" 
+0

'until'を使った' tap'メソッドは素晴らしいタッチです。私はそれが起こるかどうかは分かりませんが、あなたのメソッドは先行する '0'値を無視します。編集:私は指導者を意味する! –

+0

余分なトレイルのゼロはありません:) – mudasobwa

2
ルビーです

string = '6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2' 

p string.split(',').map { |v| v.to_i.to_s(16) }.join 
# "6ca2226c8226a24cea2" 
p '6ca2226c8226a24cea2'.each_char.map { |c| c.to_i(16) }.join(',') 
# "6,12,10,2,2,2,6,12,8,2,2,6,10,2,4,12,14,10,2" 

それは任意のDBとで簡単に読めるという利点をもたらします:迅速かつ合理的にスペース効率的なソリューションについては

は、単に16進文字列を書くことができyプログラム。

また、0が文字列に"0,0,6"の先頭にある場合でも機能します。あなたが偶数個の要素を持っている場合は

、あなたはシングルとして、それらをどのような(0 <値<16)、それらをコーディングについて2.

+0

私は単純で読みやすいので、私はこの解決策が好きです。あなたのデータが見て大丈夫かどうかを知ることが重要です。 –

+1

それにインデックスを付けることもできるという利点があります。 5番目の値を得るには(もちろんゼロから数える)、 'str [5] .to_i(16)'を実行します。 –

関連する問題