如何使用Ruby从文件加载数组?

时间:2014-06-09 19:31:26

标签: ruby arrays file-io

我有一个包含哈希数组的文件:

[
  {key1: 'value', key2: 'value'},
  {key1: 'value', key2: 'value'},
  {key1: 'value', key2: 'value'}
  ...
]

我想将整个数组加载到变量中并对其进行一些操作。为了具体而言,我想基于key1按字母顺序重新排列数组。阅读,readlines和each_line不适合我。

5 个答案:

答案 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]}

对先前的回答感到抱歉。