是否有一个Ruby工具允许我以(Abbreviated => Abr)的格式加载缩写文件?然后我需要从另一个文件中读取每个单词。如果单词与缩写中的单词匹配,我需要将其更改为缩写单词。我想我可以使用Hash,但我不知道如何从文件中加载它。
答案 0 :(得分:23)
YAML是一种非常通用的格式,用于以可在应用程序和编程语言之间传输的方式存储数据。 JSON是另一种替代方案,在网站中很常见。
我将YAML用于配置文件之类的东西,因为它非常容易阅读和修改。例如,这个Ruby结构:
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
}
}
转换为YAML时看起来像这样:
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:
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:
如果第二个参数是Hash,并且匹配的文本是其中一个键,则 对应的值是替换字符串。
这意味着您可以执行以下操作:
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
标记可能会有所帮助。做这项工作对读者来说是一种练习。
答案 1 :(得分:8)
请参阅Marshal.load
和Marshal.dump
。
此外,您可以查看将哈希序列化为yaml文件,然后通过YAML读取/保存。
答案 2 :(得分: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这里是我所在的课程。让我们以人为例。
加载方法如下
def load_collection(file_path)
hash_values = self.class.load_hash(file_path)
@collection.insert_many(hash)
end
在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
所以在这种情况下,load_hash
方法接受一个参数,在这种情况下,我传入一个包含一些数据的json文件。然后我将该数据插入到我的集合中。