我有一个包含哈希数组的文件:
[
{key1: 'value', key2: 'value'},
{key1: 'value', key2: 'value'},
{key1: 'value', key2: 'value'}
...
]
我想将整个数组加载到变量中并对其进行一些操作。为了具体而言,我想基于key1按字母顺序重新排列数组。阅读,readlines和each_line不适合我。
答案 0 :(得分:3)
由于您的文件是有效的Ruby,如果它来自受信任的来源,您只需eval
:
my_sorted_array = eval(IO.read('test.txt')).sort_by { |e| e[:key1] }
答案 1 :(得分:2)
建议以yaml格式存储此类数据。写文件就像(记住间距!):
---
- :key1: value
:key2: value
- :key1: value
:key2: value
- :key1: value
:key2: value
然后就这样做:
require 'yaml'
array = YAML.parse_file('/path/to/your/file')
要将数据保存到这样的文件(require 'yaml'
也需要运行它):
File.open('/path/to/file', 'w') { |f| f.write array.to_yaml }
答案 2 :(得分:1)
作为规则,Hash.to_s
是单向函数 - 没有简单的方法来解析它。鉴于格式很简单,正如您所说,您可以这样做:
text = IO.read('test.txt')
# normalize text to a valid JSON:
# turns 'value' to "value"
text.gsub!("'", '"')
# turns key1: to "key1":
text.gsub!(/([{,])\s*([^{":\s]+)\s*:/, '\1 "\2":')
#parse it
array = JSON.parse(text)
sorted = array.sort_by { |h| h['key1'] }
# => [{"key1"=>"value1", "key2"=>"value"}, {"key1"=>"value2", "key2"=>"value"}, {"key1"=>"value3", "key2"=>"value"}]
答案 3 :(得分:1)
我建议如下:
require 'yaml'
data = YAML.load_file '<filename>'
data.sort_by{|hash| hash[:key1]}
您的文件看起来有点像JSON数据,但包含一些次要的格式差异,这使得使用JSON解析器变得不可能。值得庆幸的是,数据是完全有效的YAML,因此Ruby的YAML解析器可以很好地读取它。
答案 4 :(得分:0)
这应该适合你:
str = ""
File.open('<path_to_file>').each do |line|
str += line.strip
end
hash_array = eval(str)
hash_array.sort_by!{|t| t[:key1]}
对先前的回答感到抱歉。