2016-12-04 2 views
0

Допустим у меня есть стандартный файл CSVПерестановка CSV, удалите старую и переписывают

Name,Age 
john,20 
ana,30 
steven,25 
frank,27 

Что если я хочу заказать его в порядке, в зависимости от значения «возраст» нисходящем иметь что-то вроде это

Name,Age 
ana,30 
frank,27 
steven,25 
john,20 

, а затем удалить все строки CSV и переписать их в зависимости от нового заказа?

Я знаю, что нужно создавать хэши из CSV и заказывать его, но не как достичь описанного результата.

+1

http://stackoverflow.com/questions/37786098/ruby-csvtable-sort-in-place#37786671 может помочь – Schwern

ответ

2

Ruby has a CSV library. Вы можете использовать его для чтения, сортировки и записи файлов CSV. Класс CSV является оберткой вокруг CSV::Table. CSV::Table касается самих данных, а CSV в основном обеспечивает возможность чтения из файлов.

require 'csv' 
orig_table = CSV.table("test.csv"); 

orig_table является CSV::Table объектом. К сожалению, вы не можете напрямую сортировать свои строки на месте, но вы можете отсортировать их в массиве объектов CSV::Row и поместить их в новый CSV::Table.

sorted_rows = orig_table.sort { |a,b| b[:age] <=> a[:age] } 
sorted_table = CSV::Table.new(sorted_rows) 

Тогда вы можете получить строку CSV из этого с to_csv и записать его обратно в файл.

File.open("test.csv", "w").write(sorted_table.to_csv) 
+0

Кажется работать даже без 'to_csv'. – steenslag

+0

@steenslag 'to_csv' и' to_s' совпадают, поэтому оставлять 'to_csv' зависит от строковой сортировки' sorted_table' по умолчанию. – Schwern