2017-06-07 64 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