diff --git a/src/main/julia/main.jl b/src/main/julia/main.jl new file mode 100644 index 0000000..44d59c6 --- /dev/null +++ b/src/main/julia/main.jl @@ -0,0 +1,65 @@ +using Mmap + +mutable struct StationMeasurements + min::Float64 + max::Float64 + sum::Float64 + count::Int64 +end + +function update(sm, temp::Float64) + if temp < min + sm.min = temp + elseif temp > max + sm.max = temp + end + sm.sum += temp + sm.count += 1 +end + +function print_measurements(stations::Dict{String,StationMeasurements}) + sorted_keys = sort(collect(keys(stations))) + print("{") + sm_vec = [] + for city in sorted_keys + sm = stations[city] + min = round(sm.min; digits=1) + max = round(sm.max; digits=1) + avg = round((sm.sum / sm.count); digits=1) + push!(sm_vec, "$city=$min/$avg/$max") + end + joined = join(sm_vec, ", ") + print(joined) + print("}") +end + +function main() + open("../../../measurements.txt", "r") do f + println("Start") + stations = Dict{String,StationMeasurements}() + iteration = 0 + for line in eachline(f) + if iteration % 1000000 == 0 && iteration > 0 + print("\x1b[J\x1b[H") + percent = round((iteration / 1000000000) * 100; digits=2) + println("$(percent)%") + end + station, temp_str = rsplit(line, ";") + temp = parse(Float32, temp_str) + if haskey(stations, station) + sm = stations[station] + sm.min = ifelse(temp < sm.min, temp, sm.min) + sm.max = ifelse(temp > sm.max, temp, sm.max) + sm.sum += temp + sm.count += 1 + else + stations[station] = StationMeasurements(temp, temp, temp, 1) + end + iteration += 1 + end + print_measurements(stations) + println("End") + end +end + +main()