2016-04-21 22 views
1

Ich habe eine Datei mit dem Namen „output.txt“ drucken:Wie Schlüssel und Werte aus einer Textdatei

"name": "abc", 
    "age": 28, 
    "name": "xxx", 
    "age": 11, 
    "name": "yyyb", 
    "age": 15, 

Ich mag die Datei lesen und drucken Sie Namen und die Alten Wert in einer Zeile, einer nach der andere:

abc 28 
xxx 11 
yyyb 15 

der Code, den ich geschrieben habe, ist:

file_data = {} 
    object= File.open('output.txt', 'r') do |file| 
    file.each_line do |line| 
    key,value = line 
    file_data[value] = key 
    puts file_data 

ich erhalte:

{nil=>" \"name\": \"abc"\",\n"} 
{nil=>" \"age\": 28,\n"} 
{nil=>" \"name\": \"11"\",\n"} 
{nil=>" \"age\": false,\n"} 
{nil=>" \"name\": \"yyyb\",\n"} 
{nil=>" \"age\": 15,\n"} 
+0

Sie nicht die Linie zu zwei Variablen zuweisen und sie in einem Hash setzen und drucken das. Parsen Sie es einfach (wahrscheinlich mit einem regulären Ausdruck) und drucken Sie die Teile, die Sie wollen. –

+0

Warum verwenden Sie keine yaml-Datei? – 13aal

+0

Ja, es ist viel besser, YAML oder JSON zu verwenden, weil das Ausgeben und Parsen trivial einfach ist. Sie sollten die Formatierung und Analyse nicht manuell codieren, wenn dies für Sie möglich ist. –

Antwort

0

Der beste Weg ist, einige beliebte Format wie YAML oder JSON zu verwenden, so dass Sie damit arbeiten können, mit einer Bibliothek. Auch Sie könnten es mit Code wie folgt erreichen:

file_data = "" 
object= File.open('output.txt', 'r') do |file| 
    file.each_line do |line| 
    key, value = line.split(':').map{|e| e.strip.gsub(/(,|\")/,'')} 
    file_data << (key == 'name' ? "#{value} " : "#{value}\n") 
    end 
end 
puts file_data 
+0

Danke für Ihre Antwort, aber ich kann nur den letzten Hash aus der Datei sehen. die Ausgabe {"name" => "yyyb", "alter" => 15 "} kann andere Werte aus der Datei – user1642224

+0

@ user1642224 nicht sehen Was möchten Sie als Ausgabe haben? –

+0

@ user1642224 sehen Sie die aktualisierte Antwort. –

0
File.read('output.txt') 
    .split(/\s*,\s*/) 
    .each_slice(2) 
    .each do |name, age| 
    puts [name[/(?<=: ").*(?=")/], age[/(?<=:).*/]].join ' ' 
end 
+0

@ mudasobwa ich bin die Ausgabe in diesem Format Name abc Alter 28 Name xxx Alter 11 Name yyyb Alter von 15 Jahren erhalten. Aber ich brauche in der Tat in diesem Format abc 28 xxx 11 yyyb 15 – user1642224

+0

Oh sein. Es tut uns Leid. Aktualisiert – mudasobwa

+0

danke @mudasobwa – user1642224