[英]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.