2016-06-13 4 views
0

Ich sortiere ein CSV::Table Objekt. Ich habe eine Tabelle mit Kopfzeilen ("date", "amount", "source") und O(50) Einträge.Ruby CSV :: Tabelle an Ort und Stelle sortieren

Eingang:

data = CSV.table('filename.csv', headers:true) # note headers are :date, :source, :amount 

amounts = [] 
data[:amount].each {|i| amounts << i.to_f} 

data.sort_by! {|row| row[:amount]} 
# error - not a defined function 

data = data.sort_by {|row| row[:amount]} 
# sorted but data is now an array not CSV::Table. would like to retain access to headers 

ich einen Knall Funktion wollen ohne dabei die CSV::Table Struktur der Tabelle an Ort und Stelle durch die "amount" Spalte zu sortieren. Insbesondere möchte ich, dass das Ergebnis eine CSV :: Tabelle ist, so dass ich immer noch Zugriff auf die Header habe. Im Moment bekomme ich ein Array, was ich nicht will.

Ich bin sicher, dass es eine einfachere Möglichkeit gibt, dies zu tun, vor allem mit der CSV::Table Klasse. Irgendeine Hilfe?

+0

Was meinen Sie verlieren die Struktur bedeuten? – sawa

+0

Gute Frage! Hoffte, dass die CSV :: Table-Klasse eine sort_by-Methode hatte, die eine CSV-Tabelle mit den gleichen Headern zurückgab. Es scheint, dass dies nicht der Fall ist - richtig? –

Antwort

1

können Sie verwenden:

CSV::Table.new(data) Array CSV :: Table-Objekt zu konvertieren, wenn das ist, was Sie wollen.

sort_by ist ein Verfahren aus Enumerable-Modul, das immer ein Array zurück, wenn Block als Argument angegeben wird

+0

Vielen Dank dafür. Wie würden Sie eine CSV :: Tabelle sortieren? Wäre die ESSiset-Methode etwa so: CSV :: Table.new (table.sort_by {| row | row [: amount]}) –

+0

Ja, diese Sortiermethode sieht gut aus. Sie müssen sich jedoch fragen, ob Sie die sortierten Daten wirklich in CSV :: Table konvertieren können. Wenn Sie wirklich Header benötigen, können Sie sie immer vor dem Sortieren bekommen :) – sonar0007

Verwandte Themen