Advertisement
Guest User

Untitled

a guest
Apr 7th, 2020
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.64 KB | None | 0 0
  1. # Подключаем парсер rexml и библиотеку date для эффективного использования дат
  2. require 'rexml/document'
  3. require 'date'
  4.  
  5. # Запишем путь к файлу, который лежит в том же каталоге, что и программа
  6. file_xml = "#{__dir__}/my_expenses.xml"
  7.  
  8. # Если файл не найдет, завершаем программу
  9. abort "Файл не найден" unless File.exist?(file_xml)
  10.  
  11. # Открываем файл и записываем дескриптор в переменную file
  12. file = File.new(file_xml)
  13.  
  14. # Считываем содержимое файла с помощью библиотеки rexml. Создаем новый объект
  15. # класса REXML::Document, построенный из открытого XML файла.о
  16. doc = REXML::Document.new(file)
  17.  
  18. # Закрываем файл, т.к. он нам уже не нужен
  19. file.close
  20.  
  21. # Создадим пустой ассоциативный массив amount_by_day, куда сложим все траты по
  22. # дням в формате:
  23. #
  24. # {
  25. #   день1: сумма трат в день1,
  26. #   день2: сумма трат в день2,
  27. #   ...
  28. # }
  29. #
  30. amount_by_day = {}
  31.  
  32. # Выбираем из элементов документа все тэги <expense> внутри тега <expenses> и в
  33. # цикле проходимся по ним.
  34. doc.elements.each('expenses/expense') do |item|
  35.   # Обратите внимание, эта локальная переменная item объявлена в теле цикла,
  36.   # для каждой итерации создается новая такая. За пределами цикла она не видна.
  37.  
  38.   # В локальную переменную loss_sum запишем, сколько потратили
  39.   loss_sum = item.attributes['amount'].to_i
  40.  
  41.   # В локальную переменную loss_date запишем дату траты: Date.parse создает из
  42.   # строки объект класса Date.
  43.   loss_date = Date.parse(item.attributes['date'])
  44.  
  45.   # Инициализируем нулем значение хэша, соответствующее нужному дню
  46.   # если этой даты еще не было
  47.   amount_by_day[loss_date] ||= 0
  48.  
  49.   # Эта запись эквивалентна
  50.   #
  51.   # amount_by_day[loss_date] = 0 if amount_by_day[loss_date] == nil
  52.  
  53.   # Наконец, увеличиваем в хэше нужное значение на сумму траты
  54.   amount_by_day[loss_date] += loss_sum
  55. end
  56.  
  57. p amount_by_day
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement