YouPlot/lib/uplot/preprocessing.rb

89 lines
2.1 KiB
Ruby
Raw Normal View History

2020-09-18 23:08:09 +08:00
# frozen_string_literal: true
2020-08-15 23:04:00 +08:00
require 'csv'
module Uplot
2020-08-15 22:18:33 +08:00
module Preprocessing
module_function
def input(input, delimiter, headers, transpose)
2020-08-19 21:12:24 +08:00
arr = parse_as_csv(input, delimiter)
headers = get_headers(arr, headers, transpose)
series = get_series(arr, headers, transpose)
2020-08-19 22:47:28 +08:00
if headers.nil?
Data.new(headers, series)
else
if headers.include?(nil)
warn "\e[35mHeaders contains nil in it.\e[0m"
2020-08-19 22:50:47 +08:00
elsif headers.include? ''
2020-08-19 22:47:28 +08:00
warn "\e[35mHeaders contains \"\" in it.\e[0m"
end
h_size = headers.size
s_size = series.size
if h_size == s_size
Data.new(headers, series)
elsif h_size > s_size
warn "\e[35mThe number of headers is greater than the number of series.\e[0m"
exit 1
elsif h_size < s_size
warn "\e[35mThe number of headers is less than the number of series.\e[0m"
exit 1
end
end
end
2020-08-19 21:12:24 +08:00
def parse_as_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
end