散列到YAML转换的多行文本产生最后一行

时间:2017-06-07 11:39:36

标签: ruby hash yaml

1)我正在尝试从data.txt中读取字符串

Christopher Plummer;Dec 13, 1927
Christopher Walken;Mar 31, 1943
The King of Spain;Jan  5, 1938

2)将所有字符串拆分为';'并将它们转换为哈希

3)散列到YAML

4)将YAML写入文件

问题:将YAML写入文件仅生成最后一行

data = Hash.new
require 'yaml'
filename = 'Ydata.txt'

File.read('Data.txt').each_line do |line|
  line = line.chomp 
  line = line.split ';' 
  data = { "#{line[0]}" => "#{line[1]}" }.to_yaml  
end 

File.open filename, 'w' do |f|
   f.write data
end

2 个答案:

答案 0 :(得分:0)

此行将data设置为转换为yaml的最后一个值。所以它完全取代了每个循环。

data = { "#{line[0]}" => "#{line[1]}" }.to_yaml 

更好的是......

data = {}
File.read('Data.txt').each_line do |line|
  line = line.chomp 
  line = line.split ';' 
  data[line[0]] = line[1]  
end 

File.open filename, 'w' do |f|
   f.write data.to_yaml
end

或者,如果要将每个项目单独写入filename文件,则可以打开输出文件并在输出文件块中的循环中执行File.read ...

File.open filename, 'w' do |f|
  File.read('Data.txt').each_line do |line|
    line = line.chomp 
    line = line.split ';' 
    data = { "#{line[0]}" => "#{line[1]}" }.to_yaml  
    f.write data.to_yml
  end 
end

答案 1 :(得分:-1)

看起来你在每次迭代中都覆盖data,只有一个条目的新YAML字符串。这就是为什么你只看到最后一行。尝试构建完整的ruby哈希,并在最后将整个哈希转换为YAML。像这样:

require 'yaml'

data = Hash.new
File.read('Data.txt').each_line do |line|
  k, v = line.chomp.split(';', 2)
  data[k] = v
end
File.open('Ydata.txt', 'w') do |f|
   f.write(data.to_yaml)
end