简体   繁体   English

如何使用ruby在csv中按日期排序

[英]How to sort_by dates in csv using ruby

This my csv output ,I need to sort the rows according to the earliest date of States node. 这是我的csv输出 ,我需要根据“状态”节点的最早日期对行进行排序。

require 'nokogiri'
require 'csv'
xmlfile = File.read("test3.xml")
doc = Nokogiri::XML(xmlfile)
all = []
doc.css('Firm').each_with_index do |firm,i|
 firstchild  = []
 secondchild =[]
firm.css('States').each do |rgltr_addr_node|
 if rgltr_addr_node.has_attribute?("RgltrCd")
  RgltrCd =rgltr_addr_node.attributes["RgltrCd"]&&rgltr_addr_node.attributes["RgltrCd"].value
 else 
 RgltrCd = "NA"
end
if rgltr_addr_node.has_attribute?("St")
  St = rgltr_addr_node.attributes["St"] && rgltr_addr_node.attributes["St"].value
else
St = "NA"
end
if rgltr_addr_node.has_attribute?("Dt")
  Dt = rgltr_addr_node.attributes["Dt"] && rgltr_addr_node.attributes["Dt"].value
else 
Dt ="NA"
end
firstchild[0] = RgltrCd 
firstchild[1] = St
firstchild[2] = Dt
end
firm.css('Filing').each do |filing_node|
if filing_node.has_attribute?("Dt")
  Dt = filing_node.attributes["Dt"] && filing_node.attributes["Dt"].value
else
Dt ="NA"
end
if filing_node.has_attribute?("FormVrsn")
  FormVrsn = filing_node.attributes["FormVrsn"] && filing_node.attributes["FormVrsn"].value
else 
FormVrsn ="NA"
end
  secondchild[0] = Dt 
  secondchild[1] = FormVrsn
 end
end
all << firstchild + secondchild 
end

I used the following looping for data to display in each row of csv: 我使用以下循环将数据显示在csv的每一行中:

CSV.open('new_test3_file.csv', 'wb' ) do |row|
    row << ['States', 'Filing']
    all.each do |data|
        row << data
    end

Can any one help me in sorting this by date? 有人可以帮我按日期排序吗?

Try this: 尝试这个:

csv_rows = []
CSV.foreach('new_test3_file.csv', headers: true) do |row|
  csv_rows << row.to_h
end

csv_rows.sort_by{ |row| row['Dt'] }

Here, CSV is completely text data of string provided by comma. 在这里,CSV完全是逗号提供的字符串的文本数据。

all is array of data to be written on CSV file so I suggest you to sort data inside all as per your need first and then write on csv file. all是要写入CSV文件的数据数组,因此我建议您先根据需要对所有数据进行排序,然后再写入csv文件。

all = [["Ut", "2009-01-12"], ["TY", "2003-12-21"], ["Rt", "2008-05-20"]] 

Now sort it like below if your date of state is 2nd value at inner array 现在, 如果您的状态日期是内部数组的第二个值,则按如下所示进行排序

> all.sort! { |a,b| DateTime.parse(a[1]) <=>  DateTime.parse(b[1]) }
 # => [["TY", "2003-12-21"], ["Rt", "2008-05-20"], ["Ut", "2009-01-12"]]

Now you can write this sorted data on csv file. 现在,您可以将排序后的数据写入csv文件。

Or you can use, (As @Stefan suggested in below comment) 或者您可以使用(如@Stefan在以下评论中建议的那样)

all.sort_by! { |a| a[1] }  

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM