Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Подключаем парсер rexml и библиотеку date для эффективного использования дат
- require 'rexml/document'
- require 'date'
- # Запишем путь к файлу, который лежит в том же каталоге, что и программа
- file_xml = "#{__dir__}/my_expenses.xml"
- # Если файл не найдет, завершаем программу
- abort "Файл не найден" unless File.exist?(file_xml)
- # Открываем файл и записываем дескриптор в переменную file
- file = File.new(file_xml)
- # Считываем содержимое файла с помощью библиотеки rexml. Создаем новый объект
- # класса REXML::Document, построенный из открытого XML файла.о
- doc = REXML::Document.new(file)
- # Закрываем файл, т.к. он нам уже не нужен
- file.close
- # Создадим пустой ассоциативный массив amount_by_day, куда сложим все траты по
- # дням в формате:
- #
- # {
- # день1: сумма трат в день1,
- # день2: сумма трат в день2,
- # ...
- # }
- #
- amount_by_day = {}
- # Выбираем из элементов документа все тэги <expense> внутри тега <expenses> и в
- # цикле проходимся по ним.
- doc.elements.each('expenses/expense') do |item|
- # Обратите внимание, эта локальная переменная item объявлена в теле цикла,
- # для каждой итерации создается новая такая. За пределами цикла она не видна.
- # В локальную переменную loss_sum запишем, сколько потратили
- loss_sum = item.attributes['amount'].to_i
- # В локальную переменную loss_date запишем дату траты: Date.parse создает из
- # строки объект класса Date.
- loss_date = Date.parse(item.attributes['date'])
- # Инициализируем нулем значение хэша, соответствующее нужному дню
- # если этой даты еще не было
- amount_by_day[loss_date] ||= 0
- # Эта запись эквивалентна
- #
- # amount_by_day[loss_date] = 0 if amount_by_day[loss_date] == nil
- # Наконец, увеличиваем в хэше нужное значение на сумму траты
- amount_by_day[loss_date] += loss_sum
- end
- p amount_by_day
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement