This my csv output,我需要根据“ States”节点的最早日期对行进行排序。
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
我使用以下循环将数据显示在csv的每一行中:
CSV.open('new_test3_file.csv', 'wb' ) do |row|
row << ['States', 'Filing']
all.each do |data|
row << data
end
有人可以帮我按日期排序吗?
答案 0 :(得分:0)
尝试一下:
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'] }
答案 1 :(得分:0)
在这里,CSV完全是逗号提供的字符串的文本数据。
all
是要写入CSV文件的数据数组,因此我建议您先根据需要对所有数据进行排序,然后再写入csv文件。
all = [["Ut", "2009-01-12"], ["TY", "2003-12-21"], ["Rt", "2008-05-20"]]
如果您的状态日期是内部数组的第二个值,则现在按如下所示对其进行排序
> all.sort! { |a,b| DateTime.parse(a[1]) <=> DateTime.parse(b[1]) }
# => [["TY", "2003-12-21"], ["Rt", "2008-05-20"], ["Ut", "2009-01-12"]]
现在您可以将排序后的数据写到csv文件中。
或者您可以使用(如@Stefan在以下评论中建议的那样)
all.sort_by! { |a| a[1] }