2012-04-24 17 views
6

(Abbreviated => Abr)の形式で略語ファイルを読み込むことができるRubyツールはありますか?それから私は別のファイルから各単語を読む必要があります。単語が略語の単語と一致する場合は、短縮された単語に変更する必要があります。私はハッシュを使うことができると思うが、ファイルからロードする方法は分からない。Ruby:ファイルからハッシュを読み込むには?

答えて

21

YAMLは、アプリとプログラミング言語の間でやりとりできる方法でデータを保存するための非常にユニバーサルなフォーマットです。 JSONは別の代替手段であり、ウェブサイトでは非常に一般的です。

私は設定ファイルのようなものにYAMLを使用します。これは、読み込みと変更が非常に簡単だからです。例えば、このRubyの構造:YAMLに変換するとき

irb(main):002:0> foo = { 'a' => 1, 'b' => [2, 3], 'c' => { 'd' => 4, 'e' => 5 } } 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

は次のようになります。

irb(main):003:0> puts foo.to_yaml 
--- 
a: 1 
b: 
- 2 
- 3 
c: 
    d: 4 
    e: 5 

あなたはファイルにそれを救うことができる:

File.open('foo.yaml', 'w') { |fo| fo.puts foo.to_yaml } 

をし、それを読み戻します。

bar = YAML.load_file('foo.yaml') 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

類似JSONを使用してyは、:

puts foo.to_json 
{"a":1,"b":[2,3],"c":{"d":4,"e":5}} 

あなたはYAMLの場合と同様に、ファイルにJSONを保存し、それをリロードし、ハッシュに戻ってそれを回すことができます。どちらか

irb(main):011:0> File.open('foo.json', 'w') { |fo| fo.puts foo.to_json } 
nil 
irb(main):012:0> bar = JSON.parse(File.read('foo.json')) 
{ 
    "a" => 1, 
    "b" => [ 
     [0] 2, 
     [1] 3 
    ], 
    "c" => { 
     "d" => 4, 
     "e" => 5 
    } 
} 

との大きな勝利YAMLやJSONはそれらのファイルを読み込み、データを使用し、それを読み込みまたは書き込みのいずれかすることができます読み取ることができる任意の言語は以下のとおりです。これは、しかし少し異なる構文です。

Ruby Stringのgsubがハッシュを理解しているので、文字列の置換はハッシュを持つと非常に簡単です。これはthe docsからです:

2番目の引数がハッシュされ、マッチしたテキストは、その鍵の一つである場合は、 対応する値は、置換文字列です。

foo = 'Jackdaws love my giant sphinx of quartz' 
bar = { 'quartz' => 'rosy quartz', 'sphinx' => 'panda' } 
foo.gsub(Regexp.union(bar.keys), bar) 
"Jackdaws love my giant panda of rosy quartz" 

あなたが代入をやって単語境界の衝突に注意しなければならないのが、パターン内の\bフラグが助けになることができます。

これは、あなたがこのような何かを行うことができますを意味します。その作業を行うことは、読者のための練習です。

+0

これは良い説明ですが、私はyamlやjsonを持ってきても簡単な運動だけが複雑になると主張します。ファイルはすでに存在していて、すでに取得しているほどシンプルです。区切られたテキストファイルで、1行に1つのレコードです。ファイルを行単位で読み込み、分割してハッシュを作成するだけです。 – Jim

+0

ありがとうございました!それは今完璧に動作します。 – user1128637

8

Marshal.loadおよびMarshal.dumpを参照してください。

また、ハッシュをyamlファイルにシリアル化してから、YAMLを使用して読み込み/保存することもできます。

+0

'Marshal'フォーマットは、使用しているRubyのバージョンに固有のものであり、バージョンが一致しないときに' Marshal'データを読み取る方法はありません。これは、ディスクへのシリアル化のための悪いフォーマットになります。 –

0

私はこれを見つけました。http://www.rubydoc.info/gems/bosh-director/1.1868.0/Bosh%2FDirector%2FConfig.load_hash 自分でハッシュを読み込む方法を調べた後に。

私の例は、RailsアプリケーションでMongoDBを扱うときです。

私は、作業する予定のコレクションを取得するためにInitializeメソッドを設定します。ここ

def initialize @collection = self.class.collection end

self.classは、私がいるよクラスです。のは、一例として、人々を使用してみましょう。

loadメソッドがbinding.pry

[1] pry(#<People>)> file_path 
=> "people_results.json" 
[2] pry(#<People>)> hash 
=> [{"number"=>0, "first_name"=>"SHAUN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"15 to 19", "secs"=>1464}, {"number"=>1, "first_name"=>"TUAN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"masters", "secs"=>3994}, {"number"=>2, "first_name"=>"EARLINE", "last_name"=>"BROWN", "gender"=>"F", "group"=>"masters", "secs"=>1415}... 
[3] pry(#<People>)> self 
=> #<People:0x007fc80301b5f8 @coll=#<Mongo::Collection:0x70248510355560 namespace=test.people>> 
[4] pry(#<People>)> self.class 
=> People 

内側次

def load_collection(file_path) 
    hash_values = self.class.load_hash(file_path) 
    @collection.insert_many(hash) 
end 

あるので、この場合にはload_hashメソッドは、パラメータを取り、この場合、私は、JSONに渡さいくつかのデータが入ったファイルを作成します。次に、そのデータをコレクションに挿入します。

関連する問題