Add Preprocess module

This commit is contained in:
kojix2 2020-08-15 22:12:42 +09:00
parent 715236b5b4
commit 1d1ae9e1b0

View File

@ -3,6 +3,72 @@ require 'csv'
require 'unicode_plot' require 'unicode_plot'
module Uplot module Uplot
Data = Struct.new(:headers, :series)
module Preprocess
module_function
def input(input, delimiter, headers, transpose)
arr = read_csv(input, delimiter)
headers = get_headers(arr, headers, transpose)
series = get_series(arr, headers, transpose)
Data.new(headers, series)
end
def read_csv(input, delimiter)
CSV.parse(input, col_sep: delimiter)
.delete_if do |i|
i == [] or i.all? nil
end
end
# Transpose different sized ruby arrays
# https://stackoverflow.com/q/26016632
def transpose2(arr)
Array.new(arr.map(&:length).max) { |i| arr.map { |e| e[i] } }
end
def get_headers(arr, headers, transpose)
if headers
if transpose
arr.map(&:first)
else
arr[0]
end
end
end
def get_series(arr, headers, transpose)
if transpose
if headers
arr.map { |row| row[1..-1] }
else
arr
end
else
if headers
transpose2(arr[1..-1])
else
transpose2(arr)
end
end
end
def count(arr)
# tally was added in Ruby 2.7
if Enumerable.method_defined? :tally
arr.tally
else
# https://github.com/marcandre/backports
arr.each_with_object(Hash.new(0)) { |item, res| res[item] += 1 }
.tap { |h| h.default = nil }
end
.sort { |a, b| a[1] <=> b[1] }
.reverse
.transpose
end
end
class Command class Command
Params = Struct.new( Params = Struct.new(
:title, :title,