Module: YouPlot::DSV
- Defined in:
- lib/youplot/dsv.rb
Overview
Module to handle DSV (Delimiter-separated values) format. Extract header and series.
Class Method Summary collapse
- .build_data(headers, series) ⇒ Object
- .get_headers(arr, headers, transpose) ⇒ Object
- .get_series(arr, headers, transpose) ⇒ Object
- .parse(input, delimiter, headers, transpose) ⇒ Object
-
.transpose2(arr) ⇒ Object
Transpose different sized ruby arrays stackoverflow.com/q/26016632.
- .validate_headers(headers, series) ⇒ Object
Class Method Details
.build_data(headers, series) ⇒ Object
35 36 37 38 39 40 41 |
# File 'lib/youplot/dsv.rb', line 35 def build_data(headers, series) # Return if No header return Data.new(headers, series) if headers.nil? h_size, s_size = validate_headers(headers, series) Data.new(headers, series) if h_size == s_size end |
.get_headers(arr, headers, transpose) ⇒ Object
65 66 67 68 69 70 71 72 73 74 |
# File 'lib/youplot/dsv.rb', line 65 def get_headers(arr, headers, transpose) # header(-) return nil unless headers # header(+) trenspose(+) return arr.map(&:first) if transpose # header(+) transpose(-) arr[0] end |
.get_series(arr, headers, transpose) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/youplot/dsv.rb', line 76 def get_series(arr, headers, transpose) # header(-) unless headers return arr if transpose return transpose2(arr) end # header(+) but no element in the series. # TODO: should raise error? return Array.new(arr[0].size, []) if arr.size == 1 # header(+) transpose(+) return arr.map { |row| row[1..-1] } if transpose # header(+) transpose(-) transpose2(arr[1..-1]) end |
.parse(input, delimiter, headers, transpose) ⇒ Object
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/youplot/dsv.rb', line 11 def parse(input, delimiter, headers, transpose) # Parse as CSV arr = CSV.parse(input, col_sep: delimiter) # Remove blank lines arr.delete_if do |i| i == [] or i.all?(&:nil?) end # get header headers = get_headers(arr, headers, transpose) # get series series = get_series(arr, headers, transpose) build_data(headers, series) end |
.transpose2(arr) ⇒ Object
Transpose different sized ruby arrays stackoverflow.com/q/26016632
31 32 33 |
# File 'lib/youplot/dsv.rb', line 31 def transpose2(arr) Array.new(arr.map(&:length).max) { |i| arr.map { |e| e[i] } } end |
.validate_headers(headers, series) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/youplot/dsv.rb', line 43 def validate_headers(headers, series) # Warn if header contains nil warn "\e[35mHeaders contains nil in it.\e[0m" if headers.include?(nil) # Warn if header contains '' warn "\e[35mHeaders contains \"\" in it.\e[0m" if headers.include? '' # Make sure the number of elements in the header matches the number of series. h_size = headers.size s_size = series.size if h_size > s_size warn "\e[35mThe number of headers is greater than the number of series.\e[0m" exit 1 if YouPlot.run_as_executable? elsif h_size < s_size warn "\e[35mThe number of headers is less than the number of series.\e[0m" exit 1 if YouPlot.run_as_executable? end [h_size, s_size] end |