Как отсортировать даты в csv используя ruby - PullRequest
0 голосов
/ 23 января 2019

Это мой вывод csv , мне нужно отсортировать строки в соответствии с самой ранней датой узла 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

Может ли кто-нибудь помочь мне в сортировке по дате?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Здесь CSV - полностью текстовые данные строки, представленные запятой.

all - это массив данных, которые должны быть записаны в файл CSV, поэтому я предлагаю вам сначала отсортировать данные по всем необходимым параметрам, а затем записать в файл CSV.

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

Теперь сортируйте его, как показано ниже , если ваша дата состояния равна 2-му значению во внутреннем массиве

> 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] }  
0 голосов
/ 23 января 2019

Попробуйте это:

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'] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...