33require 'csv'
44
55module YouPlot
6- # Read and interpret Delimiter-separated values format file or stream.
6+ # Module to handle DSV (Delimiter-separated values) format.
7+ # Extract header and series.
78 module DSV
89 module_function
910
1011 def parse ( input , delimiter , headers , transpose )
11- arr = parse_as_csv ( input , delimiter )
12+ # Parse as CSV
13+ arr = CSV . parse ( input , col_sep : delimiter )
14+
15+ # Remove blank lines
16+ arr . delete_if do |i |
17+ i == [ ] or i . all? nil
18+ end
19+
20+ # get header
1221 headers = get_headers ( arr , headers , transpose )
22+
23+ # get series
1324 series = get_series ( arr , headers , transpose )
14- if headers . nil?
15- Data . new ( headers , series )
16- else
17- if headers . include? ( nil )
18- warn "\e [35mHeaders contains nil in it.\e [0m"
19- elsif headers . include? ''
20- warn "\e [35mHeaders contains \" \" in it.\e [0m"
21- end
22- h_size = headers . size
23- s_size = series . size
24- if h_size == s_size
25- Data . new ( headers , series )
26- elsif h_size > s_size
27- warn "\e [35mThe number of headers is greater than the number of series.\e [0m"
28- exit 1 if YouPlot . run_as_executable?
29- elsif h_size < s_size
30- warn "\e [35mThe number of headers is less than the number of series.\e [0m"
31- exit 1 if YouPlot . run_as_executable?
32- end
25+
26+ # Return if No header
27+ return Data . new ( headers , series ) if headers . nil?
28+
29+ # Warn if header contains nil
30+ warn "\e [35mHeaders contains nil in it.\e [0m" if headers . include? ( nil )
31+
32+ # Warn if header contains ''
33+ warn "\e [35mHeaders contains \" \" in it.\e [0m" if headers . include? ''
34+
35+ # Make sure the number of elements in the header matches the number of series.
36+ h_size = headers . size
37+ s_size = series . size
38+
39+ if h_size > s_size
40+ warn "\e [35mThe number of headers is greater than the number of series.\e [0m"
41+ exit 1 if YouPlot . run_as_executable?
42+
43+ elsif h_size < s_size
44+ warn "\e [35mThe number of headers is less than the number of series.\e [0m"
45+ exit 1 if YouPlot . run_as_executable?
3346 end
34- end
3547
36- def parse_as_csv ( input , delimiter )
37- CSV . parse ( input , col_sep : delimiter )
38- . delete_if do |i |
39- i == [ ] or i . all? nil
40- end
48+ Data . new ( headers , series ) if h_size == s_size
4149 end
4250
4351 # Transpose different sized ruby arrays
@@ -47,31 +55,33 @@ def transpose2(arr)
4755 end
4856
4957 def get_headers ( arr , headers , transpose )
50- if headers
51- if transpose
52- arr . map ( &:first )
53- else
54- arr [ 0 ]
55- end
56- end
58+ # header(-)
59+ return nil unless headers
60+
61+ # header(+) trenspose(+)
62+ return arr . map ( &:first ) if transpose
63+
64+ # header(+) transpose(-)
65+ arr [ 0 ]
5766 end
5867
5968 def get_series ( arr , headers , transpose )
60- if headers
61- if arr . size > 1
62- if transpose
63- arr . map { |row | row [ 1 ..-1 ] }
64- else
65- transpose2 ( arr [ 1 ..-1 ] )
66- end
67- else
68- Array . new ( arr [ 0 ] . size , [ ] )
69- end
70- elsif transpose
71- arr
72- else
73- transpose2 ( arr )
69+ # header(-)
70+ unless headers
71+ return arr if transpose
72+
73+ return transpose2 ( arr )
7474 end
75+
76+ # header(+) but no element in the series.
77+ # TODO: should raise error?
78+ return Array . new ( arr [ 0 ] . size , [ ] ) if arr . size == 1
79+
80+ # header(+) transpose(+)
81+ return arr . map { |row | row [ 1 ..-1 ] } if transpose
82+
83+ # header(+) transpose(-)
84+ transpose2 ( arr [ 1 ..-1 ] )
7585 end
7686 end
7787end
0 commit comments