2017-06-07 2 views
0

1) Ich versuche, Strings aus data.txtmehrzeiligen Text zu YAML Umwandlung Hash erzeugt letzte Zeile

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

2) geteilt alle Saiten zu lesen ';' und wandeln sie in hash

3) Hash YAML

4) schreiben YAML

Problem in Datei: Schreiben YAML-Datei erzeugt nur die letzte Zeile


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

Was ist Ihre Frage? – sawa

+1

Sie ersetzen "Daten" jede Schleife Iteration, müssen Sie entweder verketten oder in ein Array – api55

+0

Sie können die Datei in einer Zeile speichern: 'File.write (Dateiname, Daten)' –

Antwort

-1

Es sieht so aus, als ob Sie in jeder Iteration data mit einer neuen YAML-Zeichenfolge mit nur einem Eintrag überschreiben. Deshalb sehen Sie nur die letzte Zeile. Versuchen Sie, den vollständigen Ruby-Hash zu erstellen und am Ende den gesamten Hash in YAML zu konvertieren. Wie folgt aus:

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

Sie meinen 'data.to_yaml' ? –

+0

@ MarkoAvlijaš Richtig. Vielen Dank. – sawa

+0

Danke. Gut zu wissen, dass Sie es kompakter machen können. Während ich lerne, versuche ich, das mentale Modell einer Lösung ständig vor dem Zusammenbruch zu bewahren, und loses und längeres Skript hilft. Aber kurz, wie es auf den ersten Blick undurchdringlich sein mag, sieht gut aus. – user8125176

0

Diese Linie zu yaml data werden der letzte Wert umgewandelt setzt. So wird jede Schleife komplett ersetzt.

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

Besser wäre ...

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 

Alternativ, wenn Sie jedes Element einzeln in die filename Datei schreiben wollen, können Sie die Ausgabedatei öffnen und die File.read in einer Schleife tun innerhalb die Ausgabedatei blockieren ...

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

Ich verstehe. Sie haben einen großen Hash anstelle von ein paar Zeilen-Hashes gemacht. Außerdem habe ich versucht, File.open in der Schleife zu behalten, in der Hoffnung, dass es Zeile für Zeile in die Datei schreibt, wie es beim Terminal der Fall war, aber das tat es nicht. – user8125176

+0

ok, bearbeitet, um zu zeigen, wie Sie jede Zeile einzeln in die Ausgabedatei ausgeben können. – SteveTurczyn