寻求将信息从文件转换为哈希Ruby

时间:2019-02-27 02:05:11

标签: ruby

您好,我一段时间以来一直在为这个正在从事的特定项目做一些研究,但我很茫然。我想要做的是使用文件中的信息,并使用其中的一些组件作为密钥将其转换为哈希。在文件中,我有:1,Foo,20,Smith,40,John,55

我正在寻找的示例我正在寻找类似{1 =>[Foo,20], 2 =>[Smith,40] 3 => [John,55]}

的输出

这就是我得到的。

h = {}

people_file = File.open("people.txt")  # I am only looking to read here.
until people_file.eof?
  i = products_file.gets.chomp.split(",")
end
people_file.close

1 个答案:

答案 0 :(得分:0)

FName = 'test'
str = "1,Foo,20,Smith, 40,John,55"
File.write(FName, str)
  #=> 26 

base, *arr = File.read(FName).
                  split(/\s*,\s*/)
enum = (base.to_i).step
arr.each_slice(2).
    with_object({}) {|pair,h| h[enum.next]=pair}
  #=> {1=>["Foo", "20"], 2=>["Smith", "40"],
  #    3=>["John", "55"]} 

步骤如下。

s = File.read(FName)
  #=> "1,Foo,20,Smith, 40,John,55" 
base, *arr = s.split(/\s*,\s*/)
  #=> ["1", "Foo", "20", "Smith", "40", "John", "55"] 
base 
  #=> "1" 
arr
  #=> ["Foo", "20", "Smith", "40", "John", "55"] 
a = base.to_i
  #=> 1

我假设键应为以a #=> 1开头的连续整数。

enum = a.step
  #=> (1.step)
enum.next
  #=> 1      
enum.next
  #=> 2
enum.next
  #=> 3

继续

enum = a.step
b = arr.each_slice(2)
  #=> #<Enumerator: ["Foo", "20", "Smith", "40", "John", "55"]:each_slice(2)> 

请注意,我需要重新定义enum(或执行enum.rewind)以重新初始化它。通过将其枚举转换为数组,我们可以看到将由该枚举器生成的元素。

b.to_a
  #=> [["Foo", "20"], ["Smith", "40"], ["John", "55"]] 

继续

c = b.with_object({})
  #=> #<Enumerator: #<Enumerator: ["Foo", "20", "Smith", "40", "John", "55"]
  #     :each_slice(2)>:with_object({})>
c.to_a
  #=> [[["Foo", "20"], {}], [["Smith", "40"], {}], [["John", "55"], {}]]

现在空的哈希值将随着计算的进行而构建。

c.each {|pair,h| h[enum.next]=pair}
  #=> {1=>["Foo", "20"], 2=>["Smith", "40"], 3=>["John", "55"]}

要查看如何执行最后一步,each首先指示枚举器c生成第一个值,并将其传递给块。将块变量分配给该值,并执行块计算。

enum = a.step
b = arr.each_slice(2)
c = b.with_object({})

pair, h = c.next
  #=> [["Foo", "20"], {}] 
pair
  #=> ["Foo", "20"] 
h #=> {} 
h[enum.next]=pair
  #=> ["Foo", "20"] 

现在

h#=> {1=>["Foo", "20"]} 

对于枚举器c生成的其余两个元素,计算结果相似。

请参见IO::writeIO::readNumeric#stepEnumerable#each_sliceEnumerator#with_objectEnumerator#nextEnumerator#rewindwriteread响应File,因为FileIOFile.superclass #=> IO)的子类。 split的自变量,正则表达式/\s*,\s*/导致字符串在逗号与逗号周围的所有空格之间被分割。将[["Foo", "20"], {}]转换为pairhArray Decompostion的产物。