您好,我一段时间以来一直在为这个正在从事的特定项目做一些研究,但我很茫然。我想要做的是使用文件中的信息,并使用其中的一些组件作为密钥将其转换为哈希。在文件中,我有: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
答案 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::write,IO::read,Numeric#step,Enumerable#each_slice,Enumerator#with_object,Enumerator#next和Enumerator#rewind。 write
和read
响应File
,因为File
是IO
(File.superclass #=> IO
)的子类。 split
的自变量,正则表达式/\s*,\s*/
导致字符串在逗号与逗号周围的所有空格之间被分割。将[["Foo", "20"], {}]
转换为pair
和h
是Array Decompostion的产物。