2011-06-23 4 views
1

多次元配列をテキストファイルに格納して効率的に再ロードしたい。面倒なことに、配列には" ] , [ \\\""などの文字列が含まれています。ファイルにテーブルを書くarray.inspectの出力を解析して配列に戻す方法

最も簡単な方法は、ちょうどmy_array.inspectようである(右?)

どのように私は、その後のように迅速かつ容易に可能な限りバックのようになります。テキストファイルから読み込む文字列から配列を作成し直します"[\" ] , [ \\\\\\\"\"]"(上記と同様)?その後、

File.open(path, 'w') { |f| f.write Marshal.dump(ary) } 

を文字列にファイルを読み込み、

を言うことによって、アレイを再作成:
+2

テキストファイルの例を投稿して、達成しようとしていることを正確に確認できる場合は、役立つかもしれません。 –

答えて

2

私の意見では、これはあまりにも多くのトラブルのように思えます。代わりにYAMLを使用してください。

require 'yaml' 
a = [ [ [], [] ], [ [], [] ] ] 
File.open("output.yml", "w") do |f| 
    f.write a.to_yaml 
end 
b = YAML.load File.open('output.yml', 'r') 

代わりにJSONを使用できます。

0

あなたはあなたがファイルに配列を書くことができ

ary 

配列を持っていると言います

ary = Marshal.load(File.read(path)) 
+0

興味深い解決策ですが、バイナリシリアル化には独自の問題があります。私は生産でマーシャル/ピクルスを避けようとしています。代わりにYAMLやJSONに頼っています。 – Kudu

+0

YAMLはなぜ優れていますか? – Nat

+1

平文のシリアル化フォーマットが必要な場合は、yajl-ruby gemを使用することもできます。マーシャリングよりも高速です...「Marshal.dump」を「Yajl :: Encoder.encode」および「Marshal .load "" Yajl :: Parser.parse " –

4

配列に数値、文字列、配列、ハッシュなどの文字が書かれたオブジェクトのみが含まれている場合は、evalを使用できます。

a = [1, 2, 3].inspect 
# => "[1, 2, 3]" 

eval(a) 
# => [1, 2, 3] 
+1

それはまさに私が知りたかったものです。とにかく私はYAMLオプションを使用しましたが。 – Nat

+0

@Natそれを知ってよかったです。 – sawa

+0

[eval()is evil](http://www.google.ca/search?q=eval+is+evil)ですが、遅いです。ただ言って。 – Kudu

関連する問題