2016-07-03 7 views
0

Also, ich habe folgendes:Rubin: Ignorieren letzte Zeile einer Datei und fügen Sie eine Zeile in einem Array

twodarray = [] 
File.open("SG_hum50_LODG.gro", "r") do |f| 
    f.each_line do |line| 
    textarray = line.split() 
    textarray[0],textarray[1],textarray[2] = textarray[1],textarray[0],textarray[2].to_i 
    textarray[1] = textarray[1].gsub(/:/, '').to_i 
    twodarray << textarray 
    end 
end 

was ziemlich gut funktioniert. Das Problem, das ich habe, ist, ich brauche die letzte Zeile der Textdatei zu ignorieren, und ich brauche

["Sensor", "Timestamp", "Sensor Value"], 

Als erste Reihe in dem Array hinzuzufügen.

+0

Sie möchten nicht jede Zeile einer Datei aggregieren, es sei denn Sie sind _absolutely_ sicher, dass die Datei in den Speicher passt. Lesen Sie stattdessen eine Zeile, verarbeiten Sie sie und schreiben Sie sie sofort, wenn Sie eine neue Datei erstellen. Sie können am Ende den gesamten Speicher verbrauchen. _Warum_ aggregieren Sie zu "twodarray"? Ihre Frage klingt wie ein [XY-Problem] (http://meta.stackexchange.com/q/66377/153968). Sobald wir wissen, warum Sie diesen Weg gehen, können wir brauchbare Lösungen vorschlagen, aber wie alle Antworten dieses potentielle Problem fortsetzen und es nicht umgehen. –

Antwort

0

würde ich das tun

twodarray = [["Sensor", "Timestamp", "Sensor Value"]] 
File.open("SG_hum50_LODG.gro", "r") do |f| 
    f.each_line do |line| 
    textarray = line.split() 
    textarray[0], textarray[1], textarray[2] =textarray[1], textarray[0], textarray[2].to_i 
    textarray[1].gsub!(/:/, '').to_i 
    twodarray << textarray 
    end 
end 
twodarray.pop 
+0

Dies funktionierte berühmt. Ich danke dir sehr. In der Ausgabe hat jedoch Spalte 1 darum herum ... Ich bin mir nicht sicher warum, gibt es eine Möglichkeit, diese zu entfernen? Spalte 1 soll Ganzzahlen sein. – Josh

+0

Yeah statt 'textarray [0], textarray [1], textarray [2] = textarray [1], textarray [0], textarray [2] .to_i' tun' textarray [0], textarray [1], textarray [2] = textarray [1] .to_i, textarray [0], textarray [2] .to_i' –

+0

Wenn ich noch eine weitere Frage stellen könnte, wie würde ich dann die Ausgabe eines eindimensionalen Arrays machen? Ich muss nur das äußere [] umschließen das Ganze. – Josh

0

-Code

def read_sensor_data(fname, first_arr) 
    File.open(fname, "r") do |f| 
    f.each_line.with_object([first_arr]) do |line, arr| 
     next if f.eof? 
     sensor, time, value, *rest = line.split 
     arr << [time.delete(':').to_i, sensor, value.to_i, *rest] 
    end 
    end 
end 

*rest nicht benötigt wird, wenn jede Zeile der Datei keine Worte mehr als drei enthält.

Beispiel

FName = "demo" 

eine Datei erstellen.

File.write FName, 
<<-_ 
heat 10:21 16 
sound 11:45 74 
That's all, folks! 
_ 
    #=> 49 

Überprüfen Sie die Datei.

puts File.read FName 
heat 10:21 16 
sound 11:45 74 
That's all, folks! 

Versuchen Sie die Methode.

read_sensor_data FName, ["Sensor", "Timestamp", "Sensor Value"] 
    #=> [["Sensor", "Timestamp", "Sensor Value"], 
    # [1021, "heat", 16], 
    # [1145, "sound", 74]] 
0

Achten Sie darauf, Zeilen in einer Datei in einem Array zu aggregieren, da dies keine skalierbare Lösung ist. Tun Sie es nur, wenn Sie garantieren können, dass die geladene Datei und die Anforderungen Ihres Skripts niemals über den verfügbaren freien Speicher hinaus wachsen.

Ihre Frage ist nicht klar über das, was Sie versuchen, aber es klingt wie Sie versuchen, eine Datei auf der Festplatte zu ändern, die leicht mit File.foreach zum Lesen der eingehenden Datei Zeile für Zeile .

Es gibt ein paar Möglichkeiten, die letzte Zeile zu ignorieren, aber am einfachsten ist es, die Zeilen in der Datei zu zählen und dann alle bis auf die letzte Zeile zu lesen. Es gibt viele Möglichkeiten, um die Zeilen in einer Datei zu zählen, ist die einfachste den * nichts wc -l Befehl zu verwenden, was es tun konzipiert:

lines_in_file = `wc -l /path/to/file`.to_i 

und für eine reine Ruby-Lösung würde ich so etwas tun :

lines_in_file = File.foreach('input.txt').inject(0){ |i, _| i + 1 } 

Dann ist es eine einfache Sache zu zählen lines_in_file - 1 Zeilen. Dies ist ungetestet, aber es sieht nicht richtig aus:

Verwandte Themen