sycsvpro 0.1.13 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +173 -4
- data/README.rdoc +2 -1
- data/bin/sycsvpro +43 -1
- data/lib/sycsvpro/aggregator.rb +7 -7
- data/lib/sycsvpro/allocator.rb +6 -6
- data/lib/sycsvpro/analyzer.rb +10 -10
- data/lib/sycsvpro/mapper.rb +14 -14
- data/lib/sycsvpro/merger.rb +14 -14
- data/lib/sycsvpro/not_available.rb +36 -0
- data/lib/sycsvpro/spread_sheet.rb +523 -0
- data/lib/sycsvpro/spread_sheet_builder.rb +104 -0
- data/lib/sycsvpro/transposer.rb +14 -15
- data/lib/sycsvpro/unique.rb +11 -12
- data/lib/sycsvpro/version.rb +1 -1
- data/lib/sycsvpro.rb +2 -0
- data/spec/sycsvpro/not_available_spec.rb +34 -0
- data/spec/sycsvpro/spread_sheet_builder_spec.rb +35 -0
- data/spec/sycsvpro/spread_sheet_spec.rb +415 -0
- data/sycsvpro.rdoc +25 -24
- metadata +8 -2
data/lib/sycsvpro/unique.rb
CHANGED
@@ -5,20 +5,20 @@ module Sycsvpro
|
|
5
5
|
|
6
6
|
# Removes copies of rows identified by key values
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
8
|
+
# | Name | Street | Town | Country |
|
9
|
+
# | ---- | ------ | ---- | ------- |
|
10
|
+
# | Jane | Canal | Win | CA |
|
11
|
+
# | Jack | Long | Van | CA |
|
12
|
+
# | Jean | Sing | Ma | DE |
|
13
|
+
# | Jane | Canal | Win | CA |
|
14
14
|
#
|
15
15
|
# Remove copies based on column 0 (Name)
|
16
16
|
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
17
|
+
# | Name | Street | Town | Country |
|
18
|
+
# | ---- | ------ | ---- | ------- |
|
19
|
+
# | Jane | Canal | Win | CA |
|
20
|
+
# | Jack | Long | Van | CA |
|
21
|
+
# | Jean | Sing | Ma | DE |
|
22
22
|
class Unique
|
23
23
|
|
24
24
|
include Dsl
|
@@ -33,7 +33,6 @@ module Sycsvpro
|
|
33
33
|
attr_reader :col_filter
|
34
34
|
|
35
35
|
# Creates a new Unique
|
36
|
-
# :call-seq:
|
37
36
|
# Sycsvpro::Unique.new(infile: "infile.csv",
|
38
37
|
# outfile: "outfile.csv",
|
39
38
|
# rows: "1,3-4",
|
data/lib/sycsvpro/version.rb
CHANGED
data/lib/sycsvpro.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'sycsvpro/not_available'
|
2
|
+
|
3
|
+
module Sycsvpro
|
4
|
+
|
5
|
+
describe NotAvailable do
|
6
|
+
|
7
|
+
it "should return na in arithmetic expression like na + 1" do
|
8
|
+
na = NotAvailable #NotAvailable.new
|
9
|
+
|
10
|
+
(na + 1).should eq na
|
11
|
+
(na * 2).should eq na
|
12
|
+
(na / 3).should eq na
|
13
|
+
(na - 4).should eq na
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should return na in arithmetic expression like 1 + na" do
|
17
|
+
na = NotAvailable #NotAvailable.new
|
18
|
+
|
19
|
+
(1 + na).should eq na
|
20
|
+
(2 * na).should eq na
|
21
|
+
(3 / na).should eq na
|
22
|
+
(4 - na).should eq na
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return na in arbitrary arithmetic expression" do
|
26
|
+
na = NotAvailable #NotAvailable.new
|
27
|
+
|
28
|
+
(na + 1 + 2 * na).should eq na
|
29
|
+
(1 + 2 * 3 + na * 4).should eq na
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'sycsvpro/spread_sheet_builder'
|
2
|
+
|
3
|
+
module Sycsvpro
|
4
|
+
|
5
|
+
describe SpreadSheetBuilder do
|
6
|
+
|
7
|
+
it "should execute a spread sheet operation" do
|
8
|
+
file1 = File.join(File.dirname(__FILE__), "files/spread_sheet1.csv")
|
9
|
+
file2 = File.join(File.dirname(__FILE__), "files/spread_sheet2.csv")
|
10
|
+
resfile = File.join(File.dirname(__FILE__), "files/spread_sheet_res.csv")
|
11
|
+
|
12
|
+
operation = "(a*b).transpose"
|
13
|
+
|
14
|
+
SpreadSheetBuilder.new(outfile: resfile,
|
15
|
+
files: [file1,file2].join(','),
|
16
|
+
rlabels: "true,false",
|
17
|
+
clabels: "true,false",
|
18
|
+
aliases: "a,b",
|
19
|
+
operation: operation).execute
|
20
|
+
|
21
|
+
s1 = SpreadSheet.new(['Alpha','Beta','Gamma'],
|
22
|
+
['A',NotAvailable,2,3],
|
23
|
+
['B',4,5,NotAvailable],
|
24
|
+
['C',7,NotAvailable,9], r: true, c: true)
|
25
|
+
s2 = SpreadSheet.new([1,2,3],[3,2,1])
|
26
|
+
res = SpreadSheet.new(file: resfile, r: true, c: true)
|
27
|
+
|
28
|
+
res2 = (s1 * s2).transpose
|
29
|
+
|
30
|
+
expect { (s1 * s2).transpose == res }.to be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,415 @@
|
|
1
|
+
require 'sycsvpro/spread_sheet'
|
2
|
+
|
3
|
+
module Sycsvpro
|
4
|
+
|
5
|
+
describe SpreadSheet do
|
6
|
+
|
7
|
+
# Creation of spread sheets
|
8
|
+
it "should ensure all rows have the same column size" do
|
9
|
+
expect { SpreadSheet.new([1,2], [3,4,5]) }.to raise_error(RuntimeError,
|
10
|
+
"rows must be of same column size")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not accept non arrays as rows" do
|
14
|
+
expect { SpreadSheet.new("abc", "abc") }.to raise_error(RuntimeError,
|
15
|
+
"rows need to be arrays")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should require rows" do
|
19
|
+
expect { SpreadSheet.new() }.to raise_error(RuntimeError,
|
20
|
+
"needs at least one row")
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be created from file" do
|
24
|
+
file = File.join(File.dirname(__FILE__), "files/spread_sheet.csv")
|
25
|
+
|
26
|
+
s1 = SpreadSheet.new(file: file, r: true, c: true)
|
27
|
+
s2 = SpreadSheet.new(['Alpha', 'Beta', 'Gamma'],
|
28
|
+
['A',1,2,3],['B',4,5,6],['C',7,8,9],
|
29
|
+
r: true, c: true)
|
30
|
+
expect { s1 == s2 }
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be created from file with missing values" do
|
34
|
+
file = File.join(File.dirname(__FILE__), "files/spread_sheet_na.csv")
|
35
|
+
|
36
|
+
s1 = SpreadSheet.new(file: file, r: true, c: true)
|
37
|
+
s2 = SpreadSheet.new(['Alpha', 'Beta', 'Gamma'],
|
38
|
+
['A',NotAvailable,2,3],
|
39
|
+
['B',4,5,NotAvailable],
|
40
|
+
['C',7,NotAvailable,9],
|
41
|
+
r: true, c: true)
|
42
|
+
expect { s1 == s2 }
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be created from flat array" do
|
46
|
+
s1 = SpreadSheet.new(values: [1,2,3,4,5,6], cols: 2)
|
47
|
+
s2 = SpreadSheet.new([1,2],[3,4],[5,6])
|
48
|
+
s1.should eq s2
|
49
|
+
s1 = SpreadSheet.new(values: [1,2,3,4,5,6], rows: 2)
|
50
|
+
s2 = SpreadSheet.new([1,2,3],[4,5,6])
|
51
|
+
s1.should eq s2
|
52
|
+
s1 = SpreadSheet.new(values: [1,2,3,4,5,6], rows: 3, cols: 2)
|
53
|
+
s2 = SpreadSheet.new([1,2],[3,4],[5,6])
|
54
|
+
s1.should eq s2
|
55
|
+
s1 = SpreadSheet.new(values: [1,2,3,4,5], rows: 2)
|
56
|
+
s2 = SpreadSheet.new([1,2,3],[4,5,NotAvailable])
|
57
|
+
s1.should eq s2
|
58
|
+
s1 = SpreadSheet.new(values: [1,2,3,4,5], cols: 3)
|
59
|
+
s2 = SpreadSheet.new([1,2,3],[4,5,NotAvailable])
|
60
|
+
s1.should eq s2
|
61
|
+
end
|
62
|
+
|
63
|
+
# Writing of spread sheets
|
64
|
+
|
65
|
+
it "should write to file" do
|
66
|
+
file = File.join(File.dirname(__FILE__), "files/spread_sheet_out.csv")
|
67
|
+
|
68
|
+
s1 = SpreadSheet.new(['A', 'B', 'C'],['I',1,2,3],['II',4,5,6],
|
69
|
+
r: true, c: true)
|
70
|
+
s1.write(file)
|
71
|
+
Dir.glob(file).size.should eq 1
|
72
|
+
end
|
73
|
+
|
74
|
+
# Manipulating spread sheets
|
75
|
+
|
76
|
+
it "should transpose rows and columns" do
|
77
|
+
s1 = SpreadSheet.new(["C1","C2","C3"],['A',1,3,5],['B',7,11,13], r: true, c: true)
|
78
|
+
s2 = SpreadSheet.new(['A','B'],['C1',1,7],['C2',3,11],['C3',5,13], r: true, c: true)
|
79
|
+
expect { s1.tranpose == s2 }
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should assign new values to rows and columns"
|
83
|
+
|
84
|
+
it "should delete columns"
|
85
|
+
|
86
|
+
it "should delete rows"
|
87
|
+
|
88
|
+
# Information about spread sheets
|
89
|
+
|
90
|
+
it "should return the dimension of a spreadsheet" do
|
91
|
+
s1 = SpreadSheet.new([1,2,3], [3,4,5])
|
92
|
+
s1.dim.should eq [2,3]
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should return the row count" do
|
96
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6], [7,8,9])
|
97
|
+
s1.nrows.should eq 3
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should return the column count" do
|
101
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6], [7,8,9])
|
102
|
+
s1.ncols.should eq 3
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return the size" do
|
106
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6], [7,8,9])
|
107
|
+
s1.size.should eq 9
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should return default row and column labels" do
|
111
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6], [7,8,9])
|
112
|
+
s1.row_labels.should eq [0,1,2]
|
113
|
+
s1.col_labels.should eq [0,1,2]
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should check whether two spread sheets are equal" do
|
117
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6])
|
118
|
+
(s1 == s1).should be_true
|
119
|
+
s2 = SpreadSheet.new([3,2,1], [6,5,4])
|
120
|
+
(s1 == s2).should be_false
|
121
|
+
end
|
122
|
+
|
123
|
+
# Subsetting spread sheets
|
124
|
+
|
125
|
+
it "should retrieve rows based on row number" do
|
126
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6])
|
127
|
+
s2 = SpreadSheet.new([4,5,6])
|
128
|
+
s1[1,].should eq s2
|
129
|
+
s1[nil,nil].should eq s1
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should return columns based on column numbers" do
|
133
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6])
|
134
|
+
s2 = SpreadSheet.new([3],[6])
|
135
|
+
s1[nil,2].should eq s2
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should return a subset of the table" do
|
139
|
+
s1 = SpreadSheet.new([1,2,3], [4,5,6])
|
140
|
+
s2 = SpreadSheet.new([5,6])
|
141
|
+
s1[1,1..2].should eq s2
|
142
|
+
s1 = SpreadSheet.new([10,11,12], [13,14,15])
|
143
|
+
s2 = SpreadSheet.new([11,12], [14,15])
|
144
|
+
s1[nil,1..2].should eq s2
|
145
|
+
s1 = SpreadSheet.new([16,17,18], [19,20,21])
|
146
|
+
s2 = SpreadSheet.new([16,18], [19,21])
|
147
|
+
s1[nil,[0,2]].should eq s2
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should bind two spread sheets column wise" do
|
151
|
+
s1 = SpreadSheet.new([10,11,12], [13,14,15])
|
152
|
+
s2 = SpreadSheet.new([16,17,18], [19,20,21])
|
153
|
+
|
154
|
+
s3 = SpreadSheet.bind_columns(s1,s2)
|
155
|
+
result = SpreadSheet.new([10,11,12,16,17,18],[13,14,15,19,20,21])
|
156
|
+
|
157
|
+
expect { s3 == result }
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should bind two spread sheets with different row size column wise" do
|
161
|
+
s1 = SpreadSheet.new([10,11,12], [13,14,15], [16,17,18])
|
162
|
+
s2 = SpreadSheet.new([16,17,18], [19,20,21])
|
163
|
+
|
164
|
+
s3 = SpreadSheet.bind_columns(s1,s2)
|
165
|
+
result = SpreadSheet.new([10,11,12,16,17,18],[13,14,15,19,20,21],
|
166
|
+
[16,17,18,
|
167
|
+
NotAvailable,NotAvailable,NotAvailable])
|
168
|
+
|
169
|
+
expect { s3 == result }.to be_true
|
170
|
+
s3.should eq result
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should bind two spread sheets row wise" do
|
174
|
+
s1 = SpreadSheet.new([10,11,12], [13,14,15])
|
175
|
+
s2 = SpreadSheet.new([16,17,18], [19,20,21])
|
176
|
+
|
177
|
+
s3 = SpreadSheet.bind_rows(s1,s2)
|
178
|
+
result = SpreadSheet.new([10,11,12],[13,14,15],[16,17,18],[19,20,21])
|
179
|
+
|
180
|
+
expect { s3 == result }.to be_true
|
181
|
+
s3.should eq result
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should bind two spread sheets row wise with different column size" do
|
185
|
+
s1 = SpreadSheet.new([10,11,12], [13,14,15])
|
186
|
+
s2 = SpreadSheet.new([16,17], [19,20])
|
187
|
+
|
188
|
+
s3 = SpreadSheet.bind_rows(s1,s2)
|
189
|
+
result = SpreadSheet.new([10,11,12],[13,14,15],
|
190
|
+
[16,17,NotAvailable],[19,20,NotAvailable])
|
191
|
+
|
192
|
+
expect { s3 == result }.to be_true
|
193
|
+
s3.should eq result
|
194
|
+
end
|
195
|
+
|
196
|
+
# Calculating with spread sheets
|
197
|
+
|
198
|
+
it "should multiply two spread sheets of same size" do
|
199
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
200
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
201
|
+
v3 = SpreadSheet.new([5,12],[21,32])
|
202
|
+
(v1 * v2).should eq v3
|
203
|
+
end
|
204
|
+
|
205
|
+
it "should multiply two spread sheets of different size" do
|
206
|
+
v1 = SpreadSheet.new([2],[4])
|
207
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
208
|
+
v3 = SpreadSheet.new([10,12],[28,32])
|
209
|
+
(v1 * v2).should eq v3
|
210
|
+
(v2 * v1).should eq v3
|
211
|
+
|
212
|
+
v1 = SpreadSheet.new([2,3,4],[4,5,6])
|
213
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
214
|
+
v3 = SpreadSheet.new([10,18,20],[28,40,42])
|
215
|
+
(v1 * v2).should eq v3
|
216
|
+
(v2 * v1).should eq v3
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should add two spread sheets" do
|
220
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
221
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
222
|
+
v3 = SpreadSheet.new([6,8],[10,12])
|
223
|
+
(v1 + v2).should eq v3
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should subtract two spread sheets" do
|
227
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
228
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
229
|
+
v3 = SpreadSheet.new([-4,-4],[-4,-4])
|
230
|
+
(v1 - v2).should eq v3
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should devide two spread sheets" do
|
234
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
235
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
236
|
+
v3 = SpreadSheet.new([1/5,2/6],[3/7,4/8])
|
237
|
+
(v1 / v2).should eq v3
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should work with numericals" do
|
241
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
242
|
+
v2 = SpreadSheet.new([2,4],[6,8])
|
243
|
+
(v1 * 2).should eq v2
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should work with arrays" do
|
247
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
248
|
+
v2 = SpreadSheet.new([3,6],[9,8])
|
249
|
+
expect { v1 * [3,2] == v2 }.to be_true
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should multiply each column with all columns of a spread sheet" do
|
253
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
254
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
255
|
+
|
256
|
+
result = []
|
257
|
+
v1.each_column { |c| result << c*v2 }
|
258
|
+
|
259
|
+
# 1 2 5 6 5 6 10 12
|
260
|
+
# 3 4 7 8 21 24 28 32
|
261
|
+
|
262
|
+
v3 = SpreadSheet.new([5,6],[21,24])
|
263
|
+
v4 = SpreadSheet.new([10,12],[28,32])
|
264
|
+
result.should eq [v3,v4]
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should collect the result of all multiplications" do
|
268
|
+
v1 = SpreadSheet.new([1,2],[3,4])
|
269
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
270
|
+
|
271
|
+
result = v1.column_collect { |c| c * v2 }
|
272
|
+
|
273
|
+
v3 = SpreadSheet.new([5,6],[21,24])
|
274
|
+
v4 = SpreadSheet.new([10,12],[28,32])
|
275
|
+
|
276
|
+
result.should eq [v3,v4]
|
277
|
+
end
|
278
|
+
|
279
|
+
# Spread sheets with column and row labels
|
280
|
+
|
281
|
+
it "should create spread sheet with row labels" do
|
282
|
+
v1 = SpreadSheet.new([1,2],[3,4], row_labels: ['A','B'])
|
283
|
+
v1.opts[:r].should be_true
|
284
|
+
v1.opts[:c].should be_false
|
285
|
+
v1.row_labels.should eq ['A','B']
|
286
|
+
v1.col_labels.should eq [0,1]
|
287
|
+
end
|
288
|
+
|
289
|
+
it "should create spread sheet with column labels" do
|
290
|
+
v1 = SpreadSheet.new([1,2],[3,4], col_labels: ['X','Y'])
|
291
|
+
v1.opts[:r].should be_false
|
292
|
+
v1.opts[:c].should be_true
|
293
|
+
v1.row_labels.should eq [0,1]
|
294
|
+
v1.col_labels.should eq ['X','Y']
|
295
|
+
end
|
296
|
+
|
297
|
+
it "should create spread sheet with row and column labels" do
|
298
|
+
v1 = SpreadSheet.new([1,2],[3,4], row_labels: ['A','B'],
|
299
|
+
col_labels: ['X','Y'])
|
300
|
+
v1.opts[:r].should be_true
|
301
|
+
v1.opts[:c].should be_true
|
302
|
+
v1.row_labels.should eq ['A','B']
|
303
|
+
v1.col_labels.should eq ['X','Y']
|
304
|
+
end
|
305
|
+
|
306
|
+
it "should create spread sheet with uncomplete row and column labels" do
|
307
|
+
v1 = SpreadSheet.new([1,2,3],[3,4,5],[6,7,8], row_labels: ['A','B'],
|
308
|
+
col_labels: ['X','Y'])
|
309
|
+
v1.opts[:r].should be_true
|
310
|
+
v1.opts[:c].should be_true
|
311
|
+
v1.row_labels.should eq ['A','B',2]
|
312
|
+
v1.col_labels.should eq ['X','Y',2]
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should return provided row labels" do
|
316
|
+
v1 = SpreadSheet.new(['A',1,2],['B',3,4], r: true)
|
317
|
+
v1.opts[:r].should be_true
|
318
|
+
v1.opts[:c].should be_false
|
319
|
+
v1.row_labels.should eq ['A','B']
|
320
|
+
v1.col_labels.should eq [0,1]
|
321
|
+
end
|
322
|
+
|
323
|
+
it "should return provided column labels" do
|
324
|
+
v1 = SpreadSheet.new(['X','Y'],[1,2],[3,4], c: true)
|
325
|
+
v1.opts[:r].should be_false
|
326
|
+
v1.opts[:c].should be_true
|
327
|
+
v1.row_labels.should eq [0,1]
|
328
|
+
v1.col_labels.should eq ['X','Y']
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should return provided row and column labels" do
|
332
|
+
v1 = SpreadSheet.new(['X','Y'], ['A',1,2],['B',3,4], r: true, c: true)
|
333
|
+
v1.opts[:r].should be_true
|
334
|
+
v1.opts[:c].should be_true
|
335
|
+
v1.row_labels.should eq ['A','B']
|
336
|
+
v1.col_labels.should eq ['X','Y']
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should fill missing labels with default labels" do
|
340
|
+
v1 = SpreadSheet.new(['X','Y'], ['A',1,2,3],['B',3,4,5], r: true, c: true)
|
341
|
+
v1.opts[:r].should be_true
|
342
|
+
v1.opts[:c].should be_true
|
343
|
+
v1.row_labels.should eq ['A','B']
|
344
|
+
v1.col_labels.should eq ['X','Y',2]
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should return provided row and column labels with row column label" do
|
348
|
+
v1 = SpreadSheet.new(['Letter','X','Y'], ['A',1,2],['B',3,4], r: true, c: true)
|
349
|
+
v1.opts[:r].should be_true
|
350
|
+
v1.opts[:c].should be_true
|
351
|
+
v1.row_labels.should eq ['A','B']
|
352
|
+
v1.col_labels.should eq ['X','Y']
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should rename row and column labels with same label count" do
|
356
|
+
s1 = SpreadSheet.new([1,2,3,4],[5,6,7,8])
|
357
|
+
s1.row_labels.should eq [0,1]
|
358
|
+
s1.col_labels.should eq [0,1,2,3]
|
359
|
+
|
360
|
+
s1.rename(rows: ['A','B'], cols: ['X','Ypsilon','Z','X1'])
|
361
|
+
s1.row_labels.should eq ['A','B']
|
362
|
+
s1.col_labels.should eq ['X','Ypsilon','Z','X1']
|
363
|
+
end
|
364
|
+
|
365
|
+
it "should rename row and column labels with different label count" do
|
366
|
+
s1 = SpreadSheet.new([1,2,3,4],[5,6,7,8])
|
367
|
+
s1.row_labels.should eq [0,1]
|
368
|
+
s1.col_labels.should eq [0,1,2,3]
|
369
|
+
|
370
|
+
s1.rename(rows: ['A'], cols: ['X','Ypsilon','Z'])
|
371
|
+
s1.row_labels.should eq ['A',1]
|
372
|
+
s1.col_labels.should eq ['X','Ypsilon','Z',3]
|
373
|
+
end
|
374
|
+
|
375
|
+
it "should create subset with row and column labels" do
|
376
|
+
v1 = SpreadSheet.new(['Letter','X','Y'], ['A',1,2],['B',3,4], r: true, c: true)
|
377
|
+
v2 = v1[nil, 1]
|
378
|
+
v2.row_labels.should eq ['A', 'B']
|
379
|
+
v2.col_labels.should eq ['Y']
|
380
|
+
end
|
381
|
+
|
382
|
+
it "should multiply spread sheets with row labels" do
|
383
|
+
v1 = SpreadSheet.new(['A', 1,2],['B', 3,4], r: true)
|
384
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
385
|
+
v3 = SpreadSheet.new([5, 12], [21, 32])
|
386
|
+
v4 = v1 * v2
|
387
|
+
v4.should eq v3
|
388
|
+
v4.row_labels.should eq ['A*0', 'B*1']
|
389
|
+
v4.col_labels.should eq ['0*0','1*1']
|
390
|
+
end
|
391
|
+
|
392
|
+
it "should multiply spread sheets with column labels" do
|
393
|
+
v1 = SpreadSheet.new(['X','Y'],[1,2],[3,4], c: true)
|
394
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
395
|
+
v3 = SpreadSheet.new([5, 12], [21, 32])
|
396
|
+
v4 = v1 * v2
|
397
|
+
v4.should eq v3
|
398
|
+
v4.row_labels.should eq ['0*0','1*1']
|
399
|
+
v4.col_labels.should eq ['X*0','Y*1']
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should multiply spread sheets with row and column labels" do
|
403
|
+
v1 = SpreadSheet.new(['X','Y'],['A', 1,2],['B', 3,4], r: true, c: true)
|
404
|
+
v2 = SpreadSheet.new([5,6],[7,8])
|
405
|
+
v3 = SpreadSheet.new([5, 12], [21, 32])
|
406
|
+
v4 = v1 * v2
|
407
|
+
v4.should eq v3
|
408
|
+
v4.row_labels.should eq ['A*0', 'B*1']
|
409
|
+
v4.col_labels.should eq ['X*0', 'Y*1']
|
410
|
+
end
|
411
|
+
|
412
|
+
end
|
413
|
+
|
414
|
+
end
|
415
|
+
|
data/sycsvpro.rdoc
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
= sycsvpro
|
2
|
-
|
3
1
|
NAME
|
4
2
|
sycsvpro - Processing CSV files
|
5
3
|
|
@@ -7,7 +5,7 @@ SYNOPSIS
|
|
7
5
|
sycsvpro [global options] command [command options] [arguments...]
|
8
6
|
|
9
7
|
VERSION
|
10
|
-
0.
|
8
|
+
0.2.0
|
11
9
|
|
12
10
|
GLOBAL OPTIONS
|
13
11
|
-f, --file=FILE - CSV file to operate on (default: none)
|
@@ -17,24 +15,27 @@ GLOBAL OPTIONS
|
|
17
15
|
--version - Display the program version
|
18
16
|
|
19
17
|
COMMANDS
|
20
|
-
aggregate
|
21
|
-
allocate
|
22
|
-
analyze
|
23
|
-
calc
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
table
|
18
|
+
aggregate - Aggregates the occurences of row values. Optionally adds a sum row
|
19
|
+
allocate - Allocate specified columns from the file to a key value
|
20
|
+
analyze - Analyze the CSV file regarding columns, rows and content
|
21
|
+
calc - Process operations on columns. Optionally add a sum row for columns withnumber values
|
22
|
+
collect - Collect values of specified rows and columns from the file and group them in categories
|
23
|
+
count - Counts the occurences of column values. Uses column values as headings with count as values. Columns with a condition will be added as new columns
|
24
|
+
and the condition will be set as column name. Optionally adds a sum row
|
25
|
+
edit - Creates a script/insert file or opens a script/insert file for editing if it exists
|
26
|
+
execute - Executes the code provided in a file
|
27
|
+
extract - Extract specified rows and columns from the file
|
28
|
+
help - Shows a list of commands or help for one command
|
29
|
+
insert - Inserts rows from a file to a csv-file. You can for instance add sum operations in Excel or LibreOffice style if you want to process the resulting
|
30
|
+
file in Excel or LibreOffice
|
31
|
+
join - Join two files based on a joint column value
|
32
|
+
list - Lists script or insert files in the scripts directory with optionally listing methods of script files
|
33
|
+
map - Map values in columns to new values
|
34
|
+
merge - Merge multiple files based on a common column value with a key value at the first column of a row
|
35
|
+
sort - Sort rows based on column values. It is possible to sort on multiple columns
|
36
|
+
spreadsheet - Do arithmetic operation with table like data. The table has to have rows with same size. Arithmetic operations are *, /, + and - where the results
|
37
|
+
can be concatenated. Complete functions can be looked up at https://rubygems.org/gem/sycsvpro
|
38
|
+
table - Associates columns to a key value. A key value can be a combination of multiple column values. Values associated can be generated from an arithmetic
|
39
|
+
or string operation. Header columns can be generated dynamically based on column values
|
40
|
+
transpose - Transposes rows and columns
|
41
|
+
unique - Remove duplicate rows from a file. Duplicates are identified by key columns
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sycsvpro
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-10-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -145,11 +145,14 @@ files:
|
|
145
145
|
- lib/sycsvpro/join.rb
|
146
146
|
- lib/sycsvpro/mapper.rb
|
147
147
|
- lib/sycsvpro/merger.rb
|
148
|
+
- lib/sycsvpro/not_available.rb
|
148
149
|
- lib/sycsvpro/profiler.rb
|
149
150
|
- lib/sycsvpro/row_filter.rb
|
150
151
|
- lib/sycsvpro/script_creator.rb
|
151
152
|
- lib/sycsvpro/script_list.rb
|
152
153
|
- lib/sycsvpro/sorter.rb
|
154
|
+
- lib/sycsvpro/spread_sheet.rb
|
155
|
+
- lib/sycsvpro/spread_sheet_builder.rb
|
153
156
|
- lib/sycsvpro/table.rb
|
154
157
|
- lib/sycsvpro/transposer.rb
|
155
158
|
- lib/sycsvpro/unique.rb
|
@@ -171,10 +174,13 @@ files:
|
|
171
174
|
- spec/sycsvpro/join_spec.rb
|
172
175
|
- spec/sycsvpro/mapper_spec.rb
|
173
176
|
- spec/sycsvpro/merger_spec.rb
|
177
|
+
- spec/sycsvpro/not_available_spec.rb
|
174
178
|
- spec/sycsvpro/profiler_spec.rb
|
175
179
|
- spec/sycsvpro/row_filter_spec.rb
|
176
180
|
- spec/sycsvpro/script_list_spec.rb
|
177
181
|
- spec/sycsvpro/sorter_spec.rb
|
182
|
+
- spec/sycsvpro/spread_sheet_builder_spec.rb
|
183
|
+
- spec/sycsvpro/spread_sheet_spec.rb
|
178
184
|
- spec/sycsvpro/table_spec.rb
|
179
185
|
- spec/sycsvpro/transposer_spec.rb
|
180
186
|
- spec/sycsvpro/unique_spec.rb
|