【问题标题】:How to sort_by dates in csv using ruby如何使用 ruby​​ 对 csv 中的日期进行排序
【发布时间】:2019-06-16 21:40:50
【问题描述】:

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

谁能帮我按日期排序?

【问题讨论】:

  • 以上代码中的all 是什么?日期以字符串形式提供的字符串数组?
  • all 是一个包含单个数组组合的数组
  • all = [] 并且我将我的子数组按如下方式推送到States 和 Filing 的每个节点中:所有
  • 第一个代码块表示在csv中显示的输出
  • @ray,我更新了我的 all[],它只有两个数组。(firstchild 和 secondchild)

标签: ruby-on-rails ruby xml csv


【解决方案1】:

这里的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] }  

【讨论】:

  • all.sort_by!(&amp;:last)
  • 请找到我更新的问题一次,我需要参考特定节点对日期进行排序
【解决方案2】:

试试这个:

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'] }

【讨论】:

  • 谢谢,但不是排序。实际上我在节点下有 2 个“Dt”列。
猜你喜欢
  • 2021-09-07
  • 2014-07-06
  • 2010-12-18
  • 2012-04-12
  • 2021-03-27
  • 1970-01-01
  • 2020-02-12
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多