mirror of
				https://github.com/red-data-tools/YouPlot.git
				synced 2025-11-04 11:38:10 +08:00 
			
		
		
		
	Add Preprocess module
This commit is contained in:
		@@ -3,6 +3,72 @@ require 'csv'
 | 
			
		||||
require 'unicode_plot'
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    Params = Struct.new(
 | 
			
		||||
      :title,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user