From f839f67d3b16428f0fff70acf850acc0abffa600 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sat, 8 Dec 2018 22:53:14 +0300 Subject: [PATCH 01/13] add all --- .../Average_prices(serv)-01-2018 (1).xlsx | Bin 0 -> 101118 bytes .../~$Average_prices(serv)-01-2018 (1).xlsx | Bin 0 -> 165 bytes Shishkov_Ivan/0/Project.rb | 66 ++++++++ Shishkov_Ivan/0/WorkWithData.rb | 153 ++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 Shishkov_Ivan/0/Data/Average_prices(serv)-01-2018 (1).xlsx create mode 100644 Shishkov_Ivan/0/Data/~$Average_prices(serv)-01-2018 (1).xlsx create mode 100644 Shishkov_Ivan/0/Project.rb create mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/Data/Average_prices(serv)-01-2018 (1).xlsx b/Shishkov_Ivan/0/Data/Average_prices(serv)-01-2018 (1).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7d399d5b894a4e723f457481373015abe9bd2cdd GIT binary patch literal 101118 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�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 literal 0 HcmV?d00001 diff --git a/Shishkov_Ivan/0/Data/~$Average_prices(serv)-01-2018 (1).xlsx b/Shishkov_Ivan/0/Data/~$Average_prices(serv)-01-2018 (1).xlsx new file mode 100644 index 0000000000000000000000000000000000000000..64d16897768cb88dc69752b4cffed9ecdb05b431 GIT binary patch literal 165 zcmWeR|L*ml=kFdp`1JJkABFJDyp;U%Vg-Uggh8Igj>VeAhs7L78?hL$II)<5`3el- U44Djh3@Hrx4CM^P3<^|$09KM5p#T5? literal 0 HcmV?d00001 diff --git a/Shishkov_Ivan/0/Project.rb b/Shishkov_Ivan/0/Project.rb new file mode 100644 index 0000000..ff6373a --- /dev/null +++ b/Shishkov_Ivan/0/Project.rb @@ -0,0 +1,66 @@ +require 'roo'; + +require 'roo-xls'; + +require './WorkWithData.rb'; + +funcs = FilesParse.new; +months = { + 'январь' => 1, + 'февраль' => 2, + 'март' => 3, + 'апрель' => 4, + 'май' => 5, + 'июнь' => 6, + 'июль' => 7, + 'авуст' => 8, + 'сентябрь' => 9, + 'октябрь' => 10, + 'ноябрь' => 11, + 'декабрь' => 12, +} + +regions = ['Brest', + 'Vitebsk', + 'Gomel', + 'Grodno', + 'Minsk', + 'Minsk Region', + 'Mogilyov'] +products = Hash.new +filePaths = Dir["./data/*"] + +filePaths.each{ |filePath| + fileInstance = funcs.getFile(filePath) + + if fileInstance + funcs.fetchProductsData(fileInstance, products, regions) + end +} +loop { + puts "What price are you looking for?" + + word = gets.chomp.downcase; + + keys = funcs.findKeys(word, products); + + if keys.length == 0 + puts word.capitalize + " can not be found in database" + else + keys.each{|key| + puts "" + recentPriceData = funcs.getRecentPriceData(key, products, months) + puts key.capitalize + " is " + recentPriceData["price"].to_s + " BYN in Minsk these days." + minPrice = funcs.getMinPrice(products[key]) + puts "Lowest was on " + minPrice["year"] + + "/" + months[minPrice["month"]].to_s + + " at price " + minPrice["price"].to_s + " BYN" + maxPrice = funcs.getMaxPrice(products[key]) + puts "Maximum was on " + maxPrice["year"] + + "/" + months[maxPrice["month"]].to_s + + " at price " + maxPrice["price"].to_s + " BYN"; + } + + end + puts; +} \ No newline at end of file diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb new file mode 100644 index 0000000..7e8935f --- /dev/null +++ b/Shishkov_Ivan/0/WorkWithData.rb @@ -0,0 +1,153 @@ +class FilesParse + def initialize + puts "work"; + end + def getFile(filePath) + extention = filePath.split(".")[2]; + case extention; + when "xls" + fileInstance = Roo::Excel.new(filePath); + return fileInstance; + when "xlsx" + fileInstance = Roo::Excelx.new(filePath); + return fileInstance; + else + puts "unsupported file type: " + filePath; + return nil; + end + end + + def findKeys(word, products) + result = []; + + products.keys.each{ |key| + if(key.include?(word)) + result.push(key); + end + } + return result; + end + + def fetchProductsData(fileInstance, products, regions) + + for n in 9..fileInstance.last_row + if fileInstance.cell("E", n) == nil + next; + end + + year = fileInstance.cell("A", 3).split(" ")[2]; + month = fileInstance.cell("A", 3).split(" ")[1]; + + key = fileInstance.cell("A", n).strip.downcase; + + if !products[key] + products[key] = Hash.new; + end + if !products[key][year] + products[key][year] = Hash.new; + end + + products[key][year][month] = { + regions[0] => formatValue(fileInstance.cell("G", n), year), + regions[1] => formatValue(fileInstance.cell("I", n), year), + regions[2] => formatValue(fileInstance.cell("K", n), year), + regions[3] => formatValue(fileInstance.cell("M", n), year), + regions[4] => formatValue(fileInstance.cell("O", n), year), + regions[5] => formatValue(fileInstance.cell("Q", n), year), + regions[6] => formatValue(fileInstance.cell("S", n), year) + } + end + end + + def formatValue(val, year) + if val + result = val.to_f; + + if year.to_i < 2017 + result = result / 10000; + end + + return result.round(2); + end + end + + def getRecentPriceData(key, products, months) + currentYear = Time.now.strftime("%Y").to_s; + + currentMonth = Time.now.strftime("%m"); + + months.each{|month, monthNumber| + if monthNumber == currentMonth + currentMonth == month + end + } + + productYearData = products[key]; + + if productYearData[currentYear] + yearKey = currentYear; + else + yearKey = productYearData.keys.max{|a,b| a.to_i <=> b.to_i} + end + + productMonthData = productYearData[yearKey]; + + if productMonthData[currentMonth] + monthKey = currentMonth; + else + monthKey = productMonthData.keys.max{|a,b| months[a] <=> months[b]} + end + + return { + "price" => productMonthData[monthKey]["Minsk"], + "year" => yearKey, + "month" => monthKey + } + end + + def getMinPrice(hash) + result = Hash.new; + minYearPrice = 9999999999999; + + hash.each{|year, yearHash| + minMonthPrice = 9999999999999; + yearHash.each{|month, monthHash| + price = monthHash['Minsk'] + + if(price < minMonthPrice) + minMonthPrice = price + result['month'] = month; + end + } + if(minMonthPrice < minYearPrice) + minYearPrice = minMonthPrice; + result['year'] = year; + result['price'] = minYearPrice; + end + } + return result + end + + def getMaxPrice(hash) + result = Hash.new; + maxYearPrice = 0; + + hash.each{|year, yearHash| + maxMonthPrice = 0; + yearHash.each{|month, monthHash| + price = monthHash['Minsk'] + + if(price > maxMonthPrice) + maxMonthPrice = price; + result['month'] = month; + end + } + if(maxMonthPrice > maxYearPrice) + maxYearPrice = maxMonthPrice; + result['year'] = year; + result['price'] = maxYearPrice; + end + } + return result + end +end \ No newline at end of file From 2e38fc3b4dd261c300902d729534120c2f74e027 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 10:03:55 +0300 Subject: [PATCH 02/13] Delete Project.rb --- Shishkov_Ivan/0/Project.rb | 66 -------------------------------------- 1 file changed, 66 deletions(-) delete mode 100644 Shishkov_Ivan/0/Project.rb diff --git a/Shishkov_Ivan/0/Project.rb b/Shishkov_Ivan/0/Project.rb deleted file mode 100644 index ff6373a..0000000 --- a/Shishkov_Ivan/0/Project.rb +++ /dev/null @@ -1,66 +0,0 @@ -require 'roo'; - -require 'roo-xls'; - -require './WorkWithData.rb'; - -funcs = FilesParse.new; -months = { - 'январь' => 1, - 'февраль' => 2, - 'март' => 3, - 'апрель' => 4, - 'май' => 5, - 'июнь' => 6, - 'июль' => 7, - 'авуст' => 8, - 'сентябрь' => 9, - 'октябрь' => 10, - 'ноябрь' => 11, - 'декабрь' => 12, -} - -regions = ['Brest', - 'Vitebsk', - 'Gomel', - 'Grodno', - 'Minsk', - 'Minsk Region', - 'Mogilyov'] -products = Hash.new -filePaths = Dir["./data/*"] - -filePaths.each{ |filePath| - fileInstance = funcs.getFile(filePath) - - if fileInstance - funcs.fetchProductsData(fileInstance, products, regions) - end -} -loop { - puts "What price are you looking for?" - - word = gets.chomp.downcase; - - keys = funcs.findKeys(word, products); - - if keys.length == 0 - puts word.capitalize + " can not be found in database" - else - keys.each{|key| - puts "" - recentPriceData = funcs.getRecentPriceData(key, products, months) - puts key.capitalize + " is " + recentPriceData["price"].to_s + " BYN in Minsk these days." - minPrice = funcs.getMinPrice(products[key]) - puts "Lowest was on " + minPrice["year"] + - "/" + months[minPrice["month"]].to_s + - " at price " + minPrice["price"].to_s + " BYN" - maxPrice = funcs.getMaxPrice(products[key]) - puts "Maximum was on " + maxPrice["year"] + - "/" + months[maxPrice["month"]].to_s + - " at price " + maxPrice["price"].to_s + " BYN"; - } - - end - puts; -} \ No newline at end of file From 272c81552f2070b64b49f2d769089c057a67176c Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 10:04:03 +0300 Subject: [PATCH 03/13] Delete WorkWithData.rb --- Shishkov_Ivan/0/WorkWithData.rb | 153 -------------------------------- 1 file changed, 153 deletions(-) delete mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb deleted file mode 100644 index 7e8935f..0000000 --- a/Shishkov_Ivan/0/WorkWithData.rb +++ /dev/null @@ -1,153 +0,0 @@ -class FilesParse - def initialize - puts "work"; - end - def getFile(filePath) - extention = filePath.split(".")[2]; - case extention; - when "xls" - fileInstance = Roo::Excel.new(filePath); - return fileInstance; - when "xlsx" - fileInstance = Roo::Excelx.new(filePath); - return fileInstance; - else - puts "unsupported file type: " + filePath; - return nil; - end - end - - def findKeys(word, products) - result = []; - - products.keys.each{ |key| - if(key.include?(word)) - result.push(key); - end - } - return result; - end - - def fetchProductsData(fileInstance, products, regions) - - for n in 9..fileInstance.last_row - if fileInstance.cell("E", n) == nil - next; - end - - year = fileInstance.cell("A", 3).split(" ")[2]; - month = fileInstance.cell("A", 3).split(" ")[1]; - - key = fileInstance.cell("A", n).strip.downcase; - - if !products[key] - products[key] = Hash.new; - end - if !products[key][year] - products[key][year] = Hash.new; - end - - products[key][year][month] = { - regions[0] => formatValue(fileInstance.cell("G", n), year), - regions[1] => formatValue(fileInstance.cell("I", n), year), - regions[2] => formatValue(fileInstance.cell("K", n), year), - regions[3] => formatValue(fileInstance.cell("M", n), year), - regions[4] => formatValue(fileInstance.cell("O", n), year), - regions[5] => formatValue(fileInstance.cell("Q", n), year), - regions[6] => formatValue(fileInstance.cell("S", n), year) - } - end - end - - def formatValue(val, year) - if val - result = val.to_f; - - if year.to_i < 2017 - result = result / 10000; - end - - return result.round(2); - end - end - - def getRecentPriceData(key, products, months) - currentYear = Time.now.strftime("%Y").to_s; - - currentMonth = Time.now.strftime("%m"); - - months.each{|month, monthNumber| - if monthNumber == currentMonth - currentMonth == month - end - } - - productYearData = products[key]; - - if productYearData[currentYear] - yearKey = currentYear; - else - yearKey = productYearData.keys.max{|a,b| a.to_i <=> b.to_i} - end - - productMonthData = productYearData[yearKey]; - - if productMonthData[currentMonth] - monthKey = currentMonth; - else - monthKey = productMonthData.keys.max{|a,b| months[a] <=> months[b]} - end - - return { - "price" => productMonthData[monthKey]["Minsk"], - "year" => yearKey, - "month" => monthKey - } - end - - def getMinPrice(hash) - result = Hash.new; - minYearPrice = 9999999999999; - - hash.each{|year, yearHash| - minMonthPrice = 9999999999999; - yearHash.each{|month, monthHash| - price = monthHash['Minsk'] - - if(price < minMonthPrice) - minMonthPrice = price - result['month'] = month; - end - } - if(minMonthPrice < minYearPrice) - minYearPrice = minMonthPrice; - result['year'] = year; - result['price'] = minYearPrice; - end - } - return result - end - - def getMaxPrice(hash) - result = Hash.new; - maxYearPrice = 0; - - hash.each{|year, yearHash| - maxMonthPrice = 0; - yearHash.each{|month, monthHash| - price = monthHash['Minsk'] - - if(price > maxMonthPrice) - maxMonthPrice = price; - result['month'] = month; - end - } - if(maxMonthPrice > maxYearPrice) - maxYearPrice = maxMonthPrice; - result['year'] = year; - result['price'] = maxYearPrice; - end - } - return result - end -end \ No newline at end of file From c8d36df7a9446f7802cbdabd942292e9252aee3d Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 10:04:25 +0300 Subject: [PATCH 04/13] Add files via upload --- Shishkov_Ivan/0/Main.rb | 65 ++++++++++++++ Shishkov_Ivan/0/WorkWithData.rb | 153 ++++++++++++++++++++++++++++++++ 2 files changed, 218 insertions(+) create mode 100644 Shishkov_Ivan/0/Main.rb create mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb new file mode 100644 index 0000000..73af6ee --- /dev/null +++ b/Shishkov_Ivan/0/Main.rb @@ -0,0 +1,65 @@ +require 'roo'; + +require 'roo-xls'; + +require './WorkWithData.rb'; + +funcs = FilesParse{} +months = { + 'январь' => 1, + 'февраль' => 2, + 'март' => 3, + 'апрель' => 4, + 'май' => 5, + 'июнь' => 6, + 'июль' => 7, + 'авуст' => 8, + 'сентябрь' => 9, + 'октябрь' => 10, + 'ноябрь' => 11, + 'декабрь' => 12, +} + +regions = ['Brest', + 'Vitebsk', + 'Gomel', + 'Grodno', + 'Minsk', + 'Minsk Region', + 'Mogilyov'] +products = Hash.new +file_Paths = Dir["./data/*"] + +file_Paths.each{ |file_Path| + file = funcs.get_File(file_Path) + + if file + funcs.fetch_Products_Data(file, products, regions) + end +} +loop { + puts "What price are you looking for?" + + word = gets.chomp.downcase + + keys = funcs.find_Keys(word, products) + + if keys.length == 0 + puts word.capitalize + " can not be found in database" + else + keys.each{|key| + puts "" + recent_Price_Data = funcs.get_Recent_Price_Data(key, products, months) + puts key.capitalize + " is " + recent_PriceData["price"].to_s + " BYN in Minsk these days." + minPrice = funcs.get_Min_Price(products[key]) + puts "Lowest was on " + min_Price["year"] + + "/" + months[min_Price["month"]].to_s + + " at price " + min_Price["price"].to_s + " BYN" + max_Price = funcs.get_Max_Price(products[key]) + puts "Maximum was on " + max_Price["year"] + + "/" + months[maxPrice["month"]].to_s + + " at price " + maxPrice["price"].to_s + " BYN"; + } + end + puts +} diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb new file mode 100644 index 0000000..b647ea1 --- /dev/null +++ b/Shishkov_Ivan/0/WorkWithData.rb @@ -0,0 +1,153 @@ +class FilesParse + def initialize + puts "work" + end + def get_File(file_Path) + extention = file_Path.split(".")[2] + case extention + when "xls" + file = Roo::Excel.new(file_Path) + return file; + when "xlsx" + file = Roo::Excelx.new(file_Path) + return file + else + puts "unsupported file type: " + file_Path + return nil; + end + end + + def find_Keys(word, products) + result = [] + + products.keys.each{ |key| + if(key.include?(word)) + result.push(key) + end + } + return result + end + + def fetch_Products_Data(file, products, regions) + + for n in 9..file.last_row + if file.cell("E", n) == nil + next + end + + year = file.cell("A", 3).split(" ")[2] + month = file.cell("A", 3).split(" ")[1] + + key = file.cell("A", n).strip.downcase + + if !products[key] + products[key] = Hash.new + end + if !products[key][year] + products[key][year] = Hash.new + end + + products[key][year][month] = { + regions[0] => format_Value(file.cell("G", n), year), + regions[1] => format_Value(file.cell("I", n), year), + regions[2] => format_Value(file.cell("K", n), year), + regions[3] => format_Value(file.cell("M", n), year), + regions[4] => format_Value(file.cell("O", n), year), + regions[5] => format_Value(file.cell("Q", n), year), + regions[6] => format_Value(file.cell("S", n), year) + } + end + end + + def format_Value(val, year) + if val + result = val.to_f + + if year.to_i < 2017 + result = result / 10000 + end + + return result.round(2) + end + end + + def get_Recent_Price_Data(key, products, months) + currentYear = Time.now.strftime("%Y").to_s + + current_Month = Time.now.strftime("%m") + + months.each{|month, month_Number| + if month_Number == current_Month + current_Month == month + end + } + + product_Year_Data = products[key] + + if product_Year_Data[currentYear] + yearKey = currentYear + else + yearKey = product_Year_Data.keys.max{|a,b| a.to_i <=> b.to_i} + end + + product_Month_Data = product_Year_Data[yearKey] + + if product_Month_Data[current_Month] + monthKey = current_Month + else + monthKey = product_Month_Data.keys.max{|a,b| months[a] <=> months[b]} + end + + return { + "price" => product_Month_Data[monthKey]["Minsk"], + "year" => yearKey, + "month" => monthKey + } + end + + def get_Min_Price(hash) + result = Hash.new + min_Year_Price = hash[hash.keys[0]] + hash.each{|year, year_Hash| + min_Month_Price = 111111111 + year_Hash.each{|month, month_Hash| + price = month_Hash['Minsk'] + if price + if(price < min_Month_Price) + min_Month_Price = price + result['month'] = month + end + end + } + if(min_Month_Price < min_Year_Price) + min_Year_Price = min_Month_Price + result['year'] = year + result['price'] = min_Year_Price + end + } + return result + end + + def get_Max_Price(hash) + result = Hash {} + max_Year_Price = 0 + + hash.each{ |year, year_Hash| + max_Month_Price = 0 + year_Hash.each { |month, month_Hash| + price = month_Hash['Minsk'] + + if(price > max_Month_Price) + max_Month_Price = price + result['month'] = month + end + } + if(max_Month_Price > max_Year_Price) + max_Year_Price = max_Month_Price + result['year'] = year + result['price'] = max_Year_Price + end + } + return result + end +end From ca632edb1f26210ffe84e6ae74b57d655dd419dd Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 17:31:43 +0300 Subject: [PATCH 05/13] Delete Main.rb --- Shishkov_Ivan/0/Main.rb | 65 ----------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 Shishkov_Ivan/0/Main.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb deleted file mode 100644 index 73af6ee..0000000 --- a/Shishkov_Ivan/0/Main.rb +++ /dev/null @@ -1,65 +0,0 @@ -require 'roo'; - -require 'roo-xls'; - -require './WorkWithData.rb'; - -funcs = FilesParse{} -months = { - 'январь' => 1, - 'февраль' => 2, - 'март' => 3, - 'апрель' => 4, - 'май' => 5, - 'июнь' => 6, - 'июль' => 7, - 'авуст' => 8, - 'сентябрь' => 9, - 'октябрь' => 10, - 'ноябрь' => 11, - 'декабрь' => 12, -} - -regions = ['Brest', - 'Vitebsk', - 'Gomel', - 'Grodno', - 'Minsk', - 'Minsk Region', - 'Mogilyov'] -products = Hash.new -file_Paths = Dir["./data/*"] - -file_Paths.each{ |file_Path| - file = funcs.get_File(file_Path) - - if file - funcs.fetch_Products_Data(file, products, regions) - end -} -loop { - puts "What price are you looking for?" - - word = gets.chomp.downcase - - keys = funcs.find_Keys(word, products) - - if keys.length == 0 - puts word.capitalize + " can not be found in database" - else - keys.each{|key| - puts "" - recent_Price_Data = funcs.get_Recent_Price_Data(key, products, months) - puts key.capitalize + " is " + recent_PriceData["price"].to_s + " BYN in Minsk these days." - minPrice = funcs.get_Min_Price(products[key]) - puts "Lowest was on " + min_Price["year"] + - "/" + months[min_Price["month"]].to_s + - " at price " + min_Price["price"].to_s + " BYN" - max_Price = funcs.get_Max_Price(products[key]) - puts "Maximum was on " + max_Price["year"] + - "/" + months[maxPrice["month"]].to_s + - " at price " + maxPrice["price"].to_s + " BYN"; - } - end - puts -} From e807eb3719c40de0282378f1ce69949fbacad0d5 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 17:31:52 +0300 Subject: [PATCH 06/13] Delete WorkWithData.rb --- Shishkov_Ivan/0/WorkWithData.rb | 153 -------------------------------- 1 file changed, 153 deletions(-) delete mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb deleted file mode 100644 index b647ea1..0000000 --- a/Shishkov_Ivan/0/WorkWithData.rb +++ /dev/null @@ -1,153 +0,0 @@ -class FilesParse - def initialize - puts "work" - end - def get_File(file_Path) - extention = file_Path.split(".")[2] - case extention - when "xls" - file = Roo::Excel.new(file_Path) - return file; - when "xlsx" - file = Roo::Excelx.new(file_Path) - return file - else - puts "unsupported file type: " + file_Path - return nil; - end - end - - def find_Keys(word, products) - result = [] - - products.keys.each{ |key| - if(key.include?(word)) - result.push(key) - end - } - return result - end - - def fetch_Products_Data(file, products, regions) - - for n in 9..file.last_row - if file.cell("E", n) == nil - next - end - - year = file.cell("A", 3).split(" ")[2] - month = file.cell("A", 3).split(" ")[1] - - key = file.cell("A", n).strip.downcase - - if !products[key] - products[key] = Hash.new - end - if !products[key][year] - products[key][year] = Hash.new - end - - products[key][year][month] = { - regions[0] => format_Value(file.cell("G", n), year), - regions[1] => format_Value(file.cell("I", n), year), - regions[2] => format_Value(file.cell("K", n), year), - regions[3] => format_Value(file.cell("M", n), year), - regions[4] => format_Value(file.cell("O", n), year), - regions[5] => format_Value(file.cell("Q", n), year), - regions[6] => format_Value(file.cell("S", n), year) - } - end - end - - def format_Value(val, year) - if val - result = val.to_f - - if year.to_i < 2017 - result = result / 10000 - end - - return result.round(2) - end - end - - def get_Recent_Price_Data(key, products, months) - currentYear = Time.now.strftime("%Y").to_s - - current_Month = Time.now.strftime("%m") - - months.each{|month, month_Number| - if month_Number == current_Month - current_Month == month - end - } - - product_Year_Data = products[key] - - if product_Year_Data[currentYear] - yearKey = currentYear - else - yearKey = product_Year_Data.keys.max{|a,b| a.to_i <=> b.to_i} - end - - product_Month_Data = product_Year_Data[yearKey] - - if product_Month_Data[current_Month] - monthKey = current_Month - else - monthKey = product_Month_Data.keys.max{|a,b| months[a] <=> months[b]} - end - - return { - "price" => product_Month_Data[monthKey]["Minsk"], - "year" => yearKey, - "month" => monthKey - } - end - - def get_Min_Price(hash) - result = Hash.new - min_Year_Price = hash[hash.keys[0]] - hash.each{|year, year_Hash| - min_Month_Price = 111111111 - year_Hash.each{|month, month_Hash| - price = month_Hash['Minsk'] - if price - if(price < min_Month_Price) - min_Month_Price = price - result['month'] = month - end - end - } - if(min_Month_Price < min_Year_Price) - min_Year_Price = min_Month_Price - result['year'] = year - result['price'] = min_Year_Price - end - } - return result - end - - def get_Max_Price(hash) - result = Hash {} - max_Year_Price = 0 - - hash.each{ |year, year_Hash| - max_Month_Price = 0 - year_Hash.each { |month, month_Hash| - price = month_Hash['Minsk'] - - if(price > max_Month_Price) - max_Month_Price = price - result['month'] = month - end - } - if(max_Month_Price > max_Year_Price) - max_Year_Price = max_Month_Price - result['year'] = year - result['price'] = max_Year_Price - end - } - return result - end -end From e97252fd4c8b0041650936a3d003690f86661847 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 17:32:11 +0300 Subject: [PATCH 07/13] Add files via upload --- Shishkov_Ivan/0/Main.rb | 62 +++++++++++ Shishkov_Ivan/0/WorkWithData.rb | 182 ++++++++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 Shishkov_Ivan/0/Main.rb create mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb new file mode 100644 index 0000000..a2fc332 --- /dev/null +++ b/Shishkov_Ivan/0/Main.rb @@ -0,0 +1,62 @@ +require "roo" + +require "roo-xls" + +require "./WorkWithData.rb" + +funcs = FilesParse.new +months = { + 'январь' => 1, + 'февраль' => 2, + 'март' => 3, + 'апрель' => 4, + 'май' => 5, + 'июнь' => 6, + 'июль' => 7, + 'авуст' => 8, + 'сентябрь' => 9, + 'октябрь' => 10, + 'ноябрь' => 11, + 'декабрь' => 12, +} + +regions = ['Brest', + 'Vitebsk', + 'Gomel', + 'Grodno', + 'Minsk', + 'Grodno Region', + 'Mogilyov'] +products = Hash.new +file_Paths = Dir['./data/*'] + +file_Paths.each{ |file_Path| + file = funcs.get_File(file_Path) + + if file + funcs.fetch_Products_Data(file, products, regions) + end +} +loop { + puts 'What price are you looking for?' + word = gets.chomp.downcase + keys = funcs.find_Keys(word, products) + if keys.length == 0 + puts word.capitalize + ' can not be found in database' + else + keys.each{|key| + puts '' + recent_Price_Data = funcs.get_Recent_Price_Data(key, products, months) + puts key.capitalize + ' is ' + recent_Price_Data['price'].to_s + ' BYN in Grodno these days.' + min_Price = funcs.get_Min_Price(products[key]) + puts 'Lowest was on ' + min_Price['year'] + + '/' + months[min_Price['month']].to_s + + ' at price ' + min_Price['price'].to_s + ' BYN' + max_Price = funcs.get_Max_Price(products[key]) + puts 'Maximum was on ' + max_Price['year'] + + '/' + months[max_Price['month']].to_s + + ' at price ' + max_Price['price'].to_s + ' BYN' + } + end + puts +} diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb new file mode 100644 index 0000000..e0fa7e7 --- /dev/null +++ b/Shishkov_Ivan/0/WorkWithData.rb @@ -0,0 +1,182 @@ +class FilesParse + + attr_accessor :current_Month, + :current_Year + def initialize + puts 'work' + @current_Month = Time.now.strftime('%m') + @current_Year = Time.now.strftime('%Y').to_s + end + + def get_Mount(month, monthNumber) + current_Months = @current_Month + if monthNumber == @current_Month + return current_Months = month + end + current_Months + end + + def get_Year_Key(products, key, product_Year_Data) + if product_Year_Data[@current_Year] + return @current_Year + else + return product_Year_Data.keys.max{|a,b| a.to_i <=> b.to_i} + end + end + + def get_Month_Key(product_Month_Data, current_Months, month_Map) + if product_Month_Data[current_Months] + return current_Months + else + return product_Month_Data.keys.max{|a,b| month_Map[a] <=> month_Map[b]} + end + end + + def get_Recent_Price_Data(key, products, month_Map) + current_Months = @current_Month + month_Map.each do |month, monthNumber| + current_Months = get_Mount(month, monthNumber) + end + product_Year_Data = products[key] + year_Key = get_Year_Key(products, key, product_Year_Data) + product_Month_Data = product_Year_Data[year_Key] + month_Key = get_Month_Key(product_Month_Data, current_Months, month_Map) + {"price" => product_Month_Data[month_Key]["Minsk"], "year" => year_Key, "month" => month_Key } + end + + def get_File(file_Path) + extention = file_Path.split('.')[2] + case extention + when 'xls' + file = Roo::Excel.new(file_Path) + when 'xlsx' + file = Roo::Excelx.new(file_Path) + else + puts 'unsupported file type: ' + file_Path + end + file; + end + + def find_Keys(word, products) + keys = [] + products.keys.each{ |key| + if(key.include?(word)) + keys.push(key) + end + } + keys + end + + def fetch_Products_Data(file, products, regions) + for index in 9..file.last_row + next if file.cell('E', index) == nil + year = file.cell('A', 3).split(' ')[2] + month = file.cell('A', 3).split(' ')[1] + key = file.cell('A', index).strip.downcase + add_Products(products, year, month, key, regions, file, index) + end + end + + def add_Products(products, year, month, key, regions, file, index) + products[key] = {} unless products[key] + products[key][year] = {} unless products[key][year] + products[key][year][month] = { + regions[0] => format_Value(file.cell('G', index), year), + regions[1] => format_Value(file.cell('I', index), year), + regions[2] => format_Value(file.cell('K', index), year), + regions[3] => format_Value(file.cell('M', index), year), + regions[4] => format_Value(file.cell('O', index), year), + regions[5] => format_Value(file.cell('Q', index), year), + regions[6] => format_Value(file.cell('S', index), year)} + end + + def format_Value(val, year) + if val + result = val.to_f + + if year.to_i < 2017 + result = result / 10000 + end + + result.round(2) + end + end + + def get_Min_Price(hash) + min_year_price = 111_111_111 + result = {} + hash.each do |year, year_hash| + min_month_data = find_min_month(year_hash) + puts(min_month_data) + min_year_data = find_min_year(year, min_month_data, min_year_price) + min_year_price = min_year_data['price'] if min_year_data['price'] + result = actual_data(result, min_year_data) + end + result + end + + def find_min_month(year_hash, min_month_price = 111_111_111, min_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price < min_month_price + min_month_price = price + min_month = month + end + end + { 'price' => min_month_price, 'month' => min_month } + end + + def find_min_year(year, min_month_data, min_year_price) + result = {} + min_month_price = min_month_data['price'] + result['month'] = min_month_data['month'] + if min_month_price < min_year_price + result['price'] = min_month_price + result['year'] = year + end + result + end + + def get_Max_Price(hash) + max_year_price = 0 + result = {} + hash.each do |year, year_hash| + max_month_data = find_max_month(year_hash) + max_year_data = find_max_year(year, max_month_data, max_year_price) + max_year_price = max_year_data['price'] if max_year_data['price'] + result = actual_data(result, max_year_data) + end + result + end + + def find_max_month(year_hash, max_month_price = 0, max_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price > max_month_price + max_month_price = price + max_month = month + end + end + { 'price' => max_month_price, 'month' => max_month } + end + + def find_max_year(year, max_month_data, max_year_price) + result = {} + max_month_price = max_month_data['price'] + result['month'] = max_month_data['month'] + if max_month_price > max_year_price + result['price'] = max_month_price + result['year'] = year + end + result + end + + def actual_data(result, year_data) + result['month'] = year_data['month'] + result['price'] = year_data['price'] if year_data['price'] + result['year'] = year_data['year'] if year_data['year'] + result + end +end From 08f280423c2458904e388cb718a68d5539ff830e Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 19:17:51 +0300 Subject: [PATCH 08/13] Delete Main.rb --- Shishkov_Ivan/0/Main.rb | 62 ----------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 Shishkov_Ivan/0/Main.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb deleted file mode 100644 index a2fc332..0000000 --- a/Shishkov_Ivan/0/Main.rb +++ /dev/null @@ -1,62 +0,0 @@ -require "roo" - -require "roo-xls" - -require "./WorkWithData.rb" - -funcs = FilesParse.new -months = { - 'январь' => 1, - 'февраль' => 2, - 'март' => 3, - 'апрель' => 4, - 'май' => 5, - 'июнь' => 6, - 'июль' => 7, - 'авуст' => 8, - 'сентябрь' => 9, - 'октябрь' => 10, - 'ноябрь' => 11, - 'декабрь' => 12, -} - -regions = ['Brest', - 'Vitebsk', - 'Gomel', - 'Grodno', - 'Minsk', - 'Grodno Region', - 'Mogilyov'] -products = Hash.new -file_Paths = Dir['./data/*'] - -file_Paths.each{ |file_Path| - file = funcs.get_File(file_Path) - - if file - funcs.fetch_Products_Data(file, products, regions) - end -} -loop { - puts 'What price are you looking for?' - word = gets.chomp.downcase - keys = funcs.find_Keys(word, products) - if keys.length == 0 - puts word.capitalize + ' can not be found in database' - else - keys.each{|key| - puts '' - recent_Price_Data = funcs.get_Recent_Price_Data(key, products, months) - puts key.capitalize + ' is ' + recent_Price_Data['price'].to_s + ' BYN in Grodno these days.' - min_Price = funcs.get_Min_Price(products[key]) - puts 'Lowest was on ' + min_Price['year'] + - '/' + months[min_Price['month']].to_s + - ' at price ' + min_Price['price'].to_s + ' BYN' - max_Price = funcs.get_Max_Price(products[key]) - puts 'Maximum was on ' + max_Price['year'] + - '/' + months[max_Price['month']].to_s + - ' at price ' + max_Price['price'].to_s + ' BYN' - } - end - puts -} From f5c6c03e29a3c211168d35152233987d1b12f8ad Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 19:18:00 +0300 Subject: [PATCH 09/13] Delete WorkWithData.rb --- Shishkov_Ivan/0/WorkWithData.rb | 182 -------------------------------- 1 file changed, 182 deletions(-) delete mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb deleted file mode 100644 index e0fa7e7..0000000 --- a/Shishkov_Ivan/0/WorkWithData.rb +++ /dev/null @@ -1,182 +0,0 @@ -class FilesParse - - attr_accessor :current_Month, - :current_Year - def initialize - puts 'work' - @current_Month = Time.now.strftime('%m') - @current_Year = Time.now.strftime('%Y').to_s - end - - def get_Mount(month, monthNumber) - current_Months = @current_Month - if monthNumber == @current_Month - return current_Months = month - end - current_Months - end - - def get_Year_Key(products, key, product_Year_Data) - if product_Year_Data[@current_Year] - return @current_Year - else - return product_Year_Data.keys.max{|a,b| a.to_i <=> b.to_i} - end - end - - def get_Month_Key(product_Month_Data, current_Months, month_Map) - if product_Month_Data[current_Months] - return current_Months - else - return product_Month_Data.keys.max{|a,b| month_Map[a] <=> month_Map[b]} - end - end - - def get_Recent_Price_Data(key, products, month_Map) - current_Months = @current_Month - month_Map.each do |month, monthNumber| - current_Months = get_Mount(month, monthNumber) - end - product_Year_Data = products[key] - year_Key = get_Year_Key(products, key, product_Year_Data) - product_Month_Data = product_Year_Data[year_Key] - month_Key = get_Month_Key(product_Month_Data, current_Months, month_Map) - {"price" => product_Month_Data[month_Key]["Minsk"], "year" => year_Key, "month" => month_Key } - end - - def get_File(file_Path) - extention = file_Path.split('.')[2] - case extention - when 'xls' - file = Roo::Excel.new(file_Path) - when 'xlsx' - file = Roo::Excelx.new(file_Path) - else - puts 'unsupported file type: ' + file_Path - end - file; - end - - def find_Keys(word, products) - keys = [] - products.keys.each{ |key| - if(key.include?(word)) - keys.push(key) - end - } - keys - end - - def fetch_Products_Data(file, products, regions) - for index in 9..file.last_row - next if file.cell('E', index) == nil - year = file.cell('A', 3).split(' ')[2] - month = file.cell('A', 3).split(' ')[1] - key = file.cell('A', index).strip.downcase - add_Products(products, year, month, key, regions, file, index) - end - end - - def add_Products(products, year, month, key, regions, file, index) - products[key] = {} unless products[key] - products[key][year] = {} unless products[key][year] - products[key][year][month] = { - regions[0] => format_Value(file.cell('G', index), year), - regions[1] => format_Value(file.cell('I', index), year), - regions[2] => format_Value(file.cell('K', index), year), - regions[3] => format_Value(file.cell('M', index), year), - regions[4] => format_Value(file.cell('O', index), year), - regions[5] => format_Value(file.cell('Q', index), year), - regions[6] => format_Value(file.cell('S', index), year)} - end - - def format_Value(val, year) - if val - result = val.to_f - - if year.to_i < 2017 - result = result / 10000 - end - - result.round(2) - end - end - - def get_Min_Price(hash) - min_year_price = 111_111_111 - result = {} - hash.each do |year, year_hash| - min_month_data = find_min_month(year_hash) - puts(min_month_data) - min_year_data = find_min_year(year, min_month_data, min_year_price) - min_year_price = min_year_data['price'] if min_year_data['price'] - result = actual_data(result, min_year_data) - end - result - end - - def find_min_month(year_hash, min_month_price = 111_111_111, min_month = nil) - year_hash.each do |month, month_hash| - price = month_hash['Minsk'] - next unless price - if price < min_month_price - min_month_price = price - min_month = month - end - end - { 'price' => min_month_price, 'month' => min_month } - end - - def find_min_year(year, min_month_data, min_year_price) - result = {} - min_month_price = min_month_data['price'] - result['month'] = min_month_data['month'] - if min_month_price < min_year_price - result['price'] = min_month_price - result['year'] = year - end - result - end - - def get_Max_Price(hash) - max_year_price = 0 - result = {} - hash.each do |year, year_hash| - max_month_data = find_max_month(year_hash) - max_year_data = find_max_year(year, max_month_data, max_year_price) - max_year_price = max_year_data['price'] if max_year_data['price'] - result = actual_data(result, max_year_data) - end - result - end - - def find_max_month(year_hash, max_month_price = 0, max_month = nil) - year_hash.each do |month, month_hash| - price = month_hash['Minsk'] - next unless price - if price > max_month_price - max_month_price = price - max_month = month - end - end - { 'price' => max_month_price, 'month' => max_month } - end - - def find_max_year(year, max_month_data, max_year_price) - result = {} - max_month_price = max_month_data['price'] - result['month'] = max_month_data['month'] - if max_month_price > max_year_price - result['price'] = max_month_price - result['year'] = year - end - result - end - - def actual_data(result, year_data) - result['month'] = year_data['month'] - result['price'] = year_data['price'] if year_data['price'] - result['year'] = year_data['year'] if year_data['year'] - result - end -end From a0fbdbb3d33c07159f133c8b1ae162b83da0d23d Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 19:18:16 +0300 Subject: [PATCH 10/13] Add files via upload --- Shishkov_Ivan/0/Main.rb | 62 +++++++++++ Shishkov_Ivan/0/WorkWithData.rb | 178 ++++++++++++++++++++++++++++++++ 2 files changed, 240 insertions(+) create mode 100644 Shishkov_Ivan/0/Main.rb create mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb new file mode 100644 index 0000000..625853b --- /dev/null +++ b/Shishkov_Ivan/0/Main.rb @@ -0,0 +1,62 @@ +require "roo" + +require "roo-xls" + +require "./WorkWithData.rb" + +funcs = FilesParse.new +months = { + 'январь' => 1, + 'февраль' => 2, + 'март' => 3, + 'апрель' => 4, + 'май' => 5, + 'июнь' => 6, + 'июль' => 7, + 'авуст' => 8, + 'сентябрь' => 9, + 'октябрь' => 10, + 'ноябрь' => 11, + 'декабрь' => 12, +} + +regions = ['Brest', + 'Vitebsk', + 'Gomel', + 'Grodno', + 'Minsk', + 'Grodno Region', + 'Mogilyov'] +products = Hash.new +file_Paths = Dir['./data/*'] + +file_Paths.each{ |file_Path| + file = funcs.get_file(file_Path) + + if file + funcs.fetch_products_data(file, products, regions) + end +} +loop { + puts 'What price are you looking for?' + word = gets.chomp.downcase + keys = funcs.find_keys(word, products) + if keys.length == 0 + puts word.capitalize + ' can not be found in database' + else + keys.each{|key| + puts '' + recent_Price_Data = funcs.get_recent_price_data(key, products, months) + puts key.capitalize + ' is ' + recent_Price_Data['price'].to_s + ' BYN in Grodno these days.' + min_Price = funcs.get_min_price(products[key]) + puts 'Lowest was on ' + min_Price['year'] + + '/' + months[min_Price['month']].to_s + + ' at price ' + min_Price['price'].to_s + ' BYN' + max_Price = funcs.get_max_price(products[key]) + puts 'Maximum was on ' + max_Price['year'] + + '/' + months[max_Price['month']].to_s + + ' at price ' + max_Price['price'].to_s + ' BYN' + } + end + puts +} diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb new file mode 100644 index 0000000..69b6c06 --- /dev/null +++ b/Shishkov_Ivan/0/WorkWithData.rb @@ -0,0 +1,178 @@ +class FilesParse + + attr_accessor :current_month, + :current_year + def initialize + puts 'work' + @current_month = Time.now.strftime('%m') + @current_year = Time.now.strftime('%Y').to_s + end + + def get_mount(month, monthNumber) + current_months = @current_month + if monthNumber == @current_month + return current_months = month + end + current_months + end + + def get_year_key(products, key, product_year_data) + if product_year_data[@current_year] + return @current_year + else + return product_year_data.keys.max{|a,b| a.to_i <=> b.to_i} + end + end + + def get_month_key(product_month_data, current_months, month_Map) + if product_month_data[current_months] + return current_months + else + return product_month_data.keys.max{|a,b| month_Map[a] <=> month_Map[b]} + end + end + + def get_recent_price_data(key, products, month_Map) + current_months = @current_month + month_Map.each do |month, monthNumber| + current_months = get_mount(month, monthNumber) + end + product_year_data = products[key] + year_Key = get_year_key(products, key, product_year_data) + product_month_data = product_year_data[year_Key] + month_key = get_month_key(product_month_data, current_months, month_Map) + {'price' => product_month_data[month_key]['Minsk'], 'year' => year_Key, 'month' => month_key } + end + + def get_file(file_path) + extention = file_path.split('.')[2] + if extention == 'xls' || extention == 'xlsx' + file = Roo::Excelx.new(file_path) + else + puts 'unsupported file type: ' + file_path + end + file + end + + def find_keys(word, products) + keys = [] + products.keys.each do |key| + keys.push(key) if (key.include?(word)) + end + keys + end + + def fetch_products_data(file, products, regions) + for index in 9..file.last_row + next if file.cell('E', index).nil? + year = file.cell('A', 3).split(' ')[2] + month = file.cell('A', 3).split(' ')[1] + key = file.cell('A', index).strip.downcase + add_products(products, year, month, key, regions, file, index) + end + end + + def add_products(products, year, month, key, regions, file, index) + products[key] = {} unless products[key] + products[key][year] = {} unless products[key][year] + products[key][year][month] = { + regions[0] => format_value(file.cell('G', index), year), + regions[1] => format_value(file.cell('I', index), year), + regions[2] => format_value(file.cell('K', index), year), + regions[3] => format_value(file.cell('M', index), year), + regions[4] => format_value(file.cell('O', index), year), + regions[5] => format_value(file.cell('Q', index), year), + regions[6] => format_value(file.cell('S', index), year) +} + end + + def format_value(val, year) + if val + result = val.to_f + + if year.to_i < 2017 + result = result / 10000 + end + + result.round(2) + end + end + + def get_min_price(hash) + min_year_price = 111_111_111 + result = {} + hash.each do |year, year_hash| + min_month_data = find_min_month(year_hash) + puts(min_month_data) + min_year_data = find_min_year(year, min_month_data, min_year_price) + min_year_price = min_year_data['price'] if min_year_data['price'] + result = actual_data(result, min_year_data) + end + result + end + + def find_min_month(year_hash, min_month_price = 111_111_111, min_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price < min_month_price + min_month_price = price + min_month = month + end + end + { 'price' => min_month_price, 'month' => min_month } + end + + def find_min_year(year, min_month_data, min_year_price) + result = {} + min_month_price = min_month_data['price'] + result['month'] = min_month_data['month'] + if min_month_price < min_year_price + result['price'] = min_month_price + result['year'] = year + end + result + end + + def get_max_price(hash) + max_year_price = 0 + result = {} + hash.each do |year, year_hash| + max_month_data = find_max_month(year_hash) + max_year_data = find_max_year(year, max_month_data, max_year_price) + max_year_price = max_year_data['price'] if max_year_data['price'] + result = actual_data(result, max_year_data) + end + result + end + + def find_max_month(year_hash, max_month_price = 0, max_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price > max_month_price + max_month_price = price + max_month = month + end + end + { 'price' => max_month_price, 'month' => max_month } + end + + def find_max_year(year, max_month_data, max_year_price) + result = {} + max_month_price = max_month_data['price'] + result['month'] = max_month_data['month'] + if max_month_price > max_year_price + result['price'] = max_month_price + result['year'] = year + end + result + end + + def actual_data(result, year_data) + result['month'] = year_data['month'] + result['price'] = year_data['price'] if year_data['price'] + result['year'] = year_data['year'] if year_data['year'] + result + end +end From f2d625d132cd3e2861e7126486c62f231cc07e65 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 23:17:09 +0300 Subject: [PATCH 11/13] Delete Main.rb --- Shishkov_Ivan/0/Main.rb | 62 ----------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 Shishkov_Ivan/0/Main.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb deleted file mode 100644 index 625853b..0000000 --- a/Shishkov_Ivan/0/Main.rb +++ /dev/null @@ -1,62 +0,0 @@ -require "roo" - -require "roo-xls" - -require "./WorkWithData.rb" - -funcs = FilesParse.new -months = { - 'январь' => 1, - 'февраль' => 2, - 'март' => 3, - 'апрель' => 4, - 'май' => 5, - 'июнь' => 6, - 'июль' => 7, - 'авуст' => 8, - 'сентябрь' => 9, - 'октябрь' => 10, - 'ноябрь' => 11, - 'декабрь' => 12, -} - -regions = ['Brest', - 'Vitebsk', - 'Gomel', - 'Grodno', - 'Minsk', - 'Grodno Region', - 'Mogilyov'] -products = Hash.new -file_Paths = Dir['./data/*'] - -file_Paths.each{ |file_Path| - file = funcs.get_file(file_Path) - - if file - funcs.fetch_products_data(file, products, regions) - end -} -loop { - puts 'What price are you looking for?' - word = gets.chomp.downcase - keys = funcs.find_keys(word, products) - if keys.length == 0 - puts word.capitalize + ' can not be found in database' - else - keys.each{|key| - puts '' - recent_Price_Data = funcs.get_recent_price_data(key, products, months) - puts key.capitalize + ' is ' + recent_Price_Data['price'].to_s + ' BYN in Grodno these days.' - min_Price = funcs.get_min_price(products[key]) - puts 'Lowest was on ' + min_Price['year'] + - '/' + months[min_Price['month']].to_s + - ' at price ' + min_Price['price'].to_s + ' BYN' - max_Price = funcs.get_max_price(products[key]) - puts 'Maximum was on ' + max_Price['year'] + - '/' + months[max_Price['month']].to_s + - ' at price ' + max_Price['price'].to_s + ' BYN' - } - end - puts -} From 08426dd2ed4bf0afd5391e84d725ede7a9b298f9 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 23:17:18 +0300 Subject: [PATCH 12/13] Delete WorkWithData.rb --- Shishkov_Ivan/0/WorkWithData.rb | 178 -------------------------------- 1 file changed, 178 deletions(-) delete mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb deleted file mode 100644 index 69b6c06..0000000 --- a/Shishkov_Ivan/0/WorkWithData.rb +++ /dev/null @@ -1,178 +0,0 @@ -class FilesParse - - attr_accessor :current_month, - :current_year - def initialize - puts 'work' - @current_month = Time.now.strftime('%m') - @current_year = Time.now.strftime('%Y').to_s - end - - def get_mount(month, monthNumber) - current_months = @current_month - if monthNumber == @current_month - return current_months = month - end - current_months - end - - def get_year_key(products, key, product_year_data) - if product_year_data[@current_year] - return @current_year - else - return product_year_data.keys.max{|a,b| a.to_i <=> b.to_i} - end - end - - def get_month_key(product_month_data, current_months, month_Map) - if product_month_data[current_months] - return current_months - else - return product_month_data.keys.max{|a,b| month_Map[a] <=> month_Map[b]} - end - end - - def get_recent_price_data(key, products, month_Map) - current_months = @current_month - month_Map.each do |month, monthNumber| - current_months = get_mount(month, monthNumber) - end - product_year_data = products[key] - year_Key = get_year_key(products, key, product_year_data) - product_month_data = product_year_data[year_Key] - month_key = get_month_key(product_month_data, current_months, month_Map) - {'price' => product_month_data[month_key]['Minsk'], 'year' => year_Key, 'month' => month_key } - end - - def get_file(file_path) - extention = file_path.split('.')[2] - if extention == 'xls' || extention == 'xlsx' - file = Roo::Excelx.new(file_path) - else - puts 'unsupported file type: ' + file_path - end - file - end - - def find_keys(word, products) - keys = [] - products.keys.each do |key| - keys.push(key) if (key.include?(word)) - end - keys - end - - def fetch_products_data(file, products, regions) - for index in 9..file.last_row - next if file.cell('E', index).nil? - year = file.cell('A', 3).split(' ')[2] - month = file.cell('A', 3).split(' ')[1] - key = file.cell('A', index).strip.downcase - add_products(products, year, month, key, regions, file, index) - end - end - - def add_products(products, year, month, key, regions, file, index) - products[key] = {} unless products[key] - products[key][year] = {} unless products[key][year] - products[key][year][month] = { - regions[0] => format_value(file.cell('G', index), year), - regions[1] => format_value(file.cell('I', index), year), - regions[2] => format_value(file.cell('K', index), year), - regions[3] => format_value(file.cell('M', index), year), - regions[4] => format_value(file.cell('O', index), year), - regions[5] => format_value(file.cell('Q', index), year), - regions[6] => format_value(file.cell('S', index), year) -} - end - - def format_value(val, year) - if val - result = val.to_f - - if year.to_i < 2017 - result = result / 10000 - end - - result.round(2) - end - end - - def get_min_price(hash) - min_year_price = 111_111_111 - result = {} - hash.each do |year, year_hash| - min_month_data = find_min_month(year_hash) - puts(min_month_data) - min_year_data = find_min_year(year, min_month_data, min_year_price) - min_year_price = min_year_data['price'] if min_year_data['price'] - result = actual_data(result, min_year_data) - end - result - end - - def find_min_month(year_hash, min_month_price = 111_111_111, min_month = nil) - year_hash.each do |month, month_hash| - price = month_hash['Minsk'] - next unless price - if price < min_month_price - min_month_price = price - min_month = month - end - end - { 'price' => min_month_price, 'month' => min_month } - end - - def find_min_year(year, min_month_data, min_year_price) - result = {} - min_month_price = min_month_data['price'] - result['month'] = min_month_data['month'] - if min_month_price < min_year_price - result['price'] = min_month_price - result['year'] = year - end - result - end - - def get_max_price(hash) - max_year_price = 0 - result = {} - hash.each do |year, year_hash| - max_month_data = find_max_month(year_hash) - max_year_data = find_max_year(year, max_month_data, max_year_price) - max_year_price = max_year_data['price'] if max_year_data['price'] - result = actual_data(result, max_year_data) - end - result - end - - def find_max_month(year_hash, max_month_price = 0, max_month = nil) - year_hash.each do |month, month_hash| - price = month_hash['Minsk'] - next unless price - if price > max_month_price - max_month_price = price - max_month = month - end - end - { 'price' => max_month_price, 'month' => max_month } - end - - def find_max_year(year, max_month_data, max_year_price) - result = {} - max_month_price = max_month_data['price'] - result['month'] = max_month_data['month'] - if max_month_price > max_year_price - result['price'] = max_month_price - result['year'] = year - end - result - end - - def actual_data(result, year_data) - result['month'] = year_data['month'] - result['price'] = year_data['price'] if year_data['price'] - result['year'] = year_data['year'] if year_data['year'] - result - end -end From 613e169747da4bef912055a4900d9d1e7e413f68 Mon Sep 17 00:00:00 2001 From: Ivsh312 <43249682+Ivsh312@users.noreply.github.com> Date: Sun, 9 Dec 2018 23:18:01 +0300 Subject: [PATCH 13/13] Add files via upload --- Shishkov_Ivan/0/Main.rb | 60 +++++++++++ Shishkov_Ivan/0/WorkWithData.rb | 177 ++++++++++++++++++++++++++++++++ 2 files changed, 237 insertions(+) create mode 100644 Shishkov_Ivan/0/Main.rb create mode 100644 Shishkov_Ivan/0/WorkWithData.rb diff --git a/Shishkov_Ivan/0/Main.rb b/Shishkov_Ivan/0/Main.rb new file mode 100644 index 0000000..8d85879 --- /dev/null +++ b/Shishkov_Ivan/0/Main.rb @@ -0,0 +1,60 @@ +require "roo" +require "roo-xls" +require "./WorkWithData.rb" + +funcs = FilesParse.new +months = { + 'январь' => 1, + 'февраль' => 2, + 'март' => 3, + 'апрель' => 4, + 'май' => 5, + 'июнь' => 6, + 'июль' => 7, + 'авуст' => 8, + 'сентябрь' => 9, + 'октябрь' => 10, + 'ноябрь' => 11, + 'декабрь' => 12, +} + +regions = ['Brest', + 'Vitebsk', + 'Gomel', + 'Grodno', + 'Minsk', + 'Grodno Region', + 'Mogilyov'] +products = {} +file_paths = Dir['./data/*'] + +file_paths.each{ |file_path| + file = funcs.get_file(file_path) + + if file + funcs.fetch_products_data(file, products, regions) + end +} +loop { + puts 'What price are you looking for?' + word = gets.chomp.downcase + keys = funcs.find_keys(word, products) + if keys.length == 0 + puts word.capitalize + ' can not be found in database' + else + keys.each{|key| + puts '' + recent_price_data = funcs.get_recent_price_data(key, products, months) + puts key.capitalize + ' is ' + recent_price_data['price'].to_s + ' BYN in Grodno these days.' + min_Price = funcs.get_min_price(products[key]) + puts 'Lowest was on ' + min_Price['year'] + + '/' + months[min_Price['month']].to_s + + ' at price ' + min_Price['price'].to_s + ' BYN' + max_price = funcs.get_max_price(products[key]) + puts 'Maximum was on ' + max_price['year'] + + '/' + months[max_price['month']].to_s + + ' at price ' + max_price['price'].to_s + ' BYN' + } + end + puts +} diff --git a/Shishkov_Ivan/0/WorkWithData.rb b/Shishkov_Ivan/0/WorkWithData.rb new file mode 100644 index 0000000..d75b684 --- /dev/null +++ b/Shishkov_Ivan/0/WorkWithData.rb @@ -0,0 +1,177 @@ +class FilesParse + attr_accessor :current_month, + :current_year + def initialize + puts 'work' + @current_month = Time.now.strftime('%m') + @current_year = Time.now.strftime('%Y').to_s + end + + def get_mount(month, monthNumber) + current_months = @current_month + if monthNumber == @current_month + return current_months = month + end + current_months + end + + def get_year_key(products, key, product_year_data) + if product_year_data[@current_year] + return @current_year + else + return product_year_data.keys.max{|a,b| a.to_i <=> b.to_i} + end + end + + def get_month_key(product_month_data, current_months, month_Map) + if product_month_data[current_months] + return current_months + else + return product_month_data.keys.max{|a,b| month_Map[a] <=> month_Map[b]} + end + end + + def get_recent_price_data(key, products, month_Map) + current_months = @current_month + month_Map.each do |month, monthNumber| + current_months = get_mount(month, monthNumber) + end + product_year_data = products[key] + year_Key = get_year_key(products, key, product_year_data) + product_month_data = product_year_data[year_Key] + month_key = get_month_key(product_month_data, current_months, month_Map) + {'price' => product_month_data[month_key]['Minsk'], 'year' => year_Key, 'month' => month_key } + end + + def get_file(file_path) + extention = file_path.split('.')[2] + if extention == 'xls' || extention == 'xlsx' + file = Roo::Excelx.new(file_path) + else + puts 'unsupported file type: ' + file_path + end + file + end + + def find_keys(word, products) + keys = [] + products.keys.each do |key| + keys.push(key) if (key.include?(word)) + end + keys + end + + def fetch_products_data(file, products, regions) + for index in 9..file.last_row + next if file.cell('E', index).nil? + year = file.cell('A', 3).split(' ')[2] + month = file.cell('A', 3).split(' ')[1] + key = file.cell('A', index).strip.downcase + add_products(products, year, month, key, regions, file, index) + end + end + + def add_products(products, year, month, key, regions, file, index) + products[key] = {} unless products[key] + products[key][year] = {} unless products[key][year] + products[key][year][month] = { + regions[0] => format_value(file.cell('G', index), year), + regions[1] => format_value(file.cell('I', index), year), + regions[2] => format_value(file.cell('K', index), year), + regions[3] => format_value(file.cell('M', index), year), + regions[4] => format_value(file.cell('O', index), year), + regions[5] => format_value(file.cell('Q', index), year), + regions[6] => format_value(file.cell('S', index), year) + } + end + + def format_value(val, year) + if val + result = val.to_f + + if year.to_i < 2017 + result = result / 10000 + end + + result.round(2) + end + end + + def get_min_price(hash) + min_year_price = 111_111_111 + result = {} + hash.each do |year, year_hash| + min_month_data = find_min_month(year_hash) + puts(min_month_data) + min_year_data = find_min_year(year, min_month_data, min_year_price) + min_year_price = min_year_data['price'] if min_year_data['price'] + result = actual_data(result, min_year_data) + end + result + end + + def find_min_month(year_hash, min_month_price = 111_111_111, min_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price < min_month_price + min_month_price = price + min_month = month + end + end + { 'price' => min_month_price, 'month' => min_month } + end + + def find_min_year(year, min_month_data, min_year_price) + result = {} + min_month_price = min_month_data['price'] + result['month'] = min_month_data['month'] + if min_month_price < min_year_price + result['price'] = min_month_price + result['year'] = year + end + result + end + + def get_max_price(hash) + max_year_price = 0 + result = {} + hash.each do |year, year_hash| + max_month_data = find_max_month(year_hash) + max_year_data = find_max_year(year, max_month_data, max_year_price) + max_year_price = max_year_data['price'] if max_year_data['price'] + result = actual_data(result, max_year_data) + end + result + end + + def find_max_month(year_hash, max_month_price = 0, max_month = nil) + year_hash.each do |month, month_hash| + price = month_hash['Minsk'] + next unless price + if price > max_month_price + max_month_price = price + max_month = month + end + end + { 'price' => max_month_price, 'month' => max_month } + end + + def find_max_year(year, max_month_data, max_year_price) + result = {} + max_month_price = max_month_data['price'] + result['month'] = max_month_data['month'] + if max_month_price > max_year_price + result['price'] = max_month_price + result['year'] = year + end + result + end + + def actual_data(result, year_data) + result['month'] = year_data['month'] + result['price'] = year_data['price'] if year_data['price'] + result['year'] = year_data['year'] if year_data['year'] + result + end +end