YouPlot/lib/youplot/dsv.rb

78 lines
1.9 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'
2020-11-23 12:09:16 +08:00
module YouPlot
# Read and interpret Delimiter-separated values format file or stream.
2020-12-21 13:25:52 +08:00
module DSV
module_function
2020-11-25 16:34:50 +08:00
2020-12-21 15:09:37 +08:00
def parse(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)
2020-12-21 20:29:39 +08:00
if headers
if arr.size > 1
if transpose
arr.map { |row| row[1..-1] }
else
transpose2(arr[1..-1])
end
else
2020-12-21 20:29:39 +08:00
Array.new(arr[0].size, [])
end
2021-01-19 18:26:41 +08:00
elsif transpose
arr
else
2021-01-19 18:26:41 +08:00
transpose2(arr)
end
end
end
end