2017-06-07 42 views
0

1)我试图从data.txt中多行文本散列到YAML转换产生最后一行

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

2读字符串)在拆分所有字符串“;”并将它们转换成散列

3)hash来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 
+0

你的问题是什么? – sawa

+1

你每次循环迭代都要更换'data',你必须连接或者把它放在一个数组中 – api55

+0

你可以把文件保存在一行中:'File.write(filename,data)' –

回答

-1

看起来你在每一次迭代中都重写了data,只有一个新的YAML字符串只有一个入口。这就是为什么你只看到最后一行。尝试构建完整的红宝石哈希,并在最后将整个哈希转换为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 
+1

你的意思是'data.to_yaml' ? –

+0

@MarkoAvlijaš对。谢谢。 – sawa

+0

谢谢。很高兴知道你可以使它更紧凑。在我学习的过程中,我努力保持解决方案的思维模型始终处于崩溃状态,而且宽松且更长的脚本可以提供帮助。但短小,因为它起初可能难以穿透,看起来不错。 – user8125176

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 
+0

我明白了。你做了一个大的散列来代替几行单行散列。另外,我试图在循环中保留File.open,希望它能像终端那样一行一行地写入File,但事实并非如此。 – user8125176

+0

ok,编辑后显示如何将每行单独输出到输出文件。 – SteveTurczyn