rbbt-util 5.21.56 → 5.21.57
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.
- checksums.yaml +4 -4
- data/lib/rbbt/tsv/excel.rb +178 -62
- data/lib/rbbt/util/excel2tsv.rb +2 -33
- data/lib/rbbt/util/open.rb +1 -0
- data/share/rbbt_commands/tsv/read +1 -1
- data/share/rbbt_commands/tsv/read_excel +39 -0
- data/share/rbbt_commands/tsv/write_excel +62 -0
- data/test/rbbt/tsv/test_excel.rb +137 -0
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 92a11a2f42a6597852eb74111dc2355f6704ac1f
|
|
4
|
+
data.tar.gz: 15716a971a9ea69dc92a86ea9d9adfb76bea6d44
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: da503c49cffbf5dd1c1f438e51ff196c0167c2718a7e2856267b84117e042065fef188666ea9e60c9c14da8e3773452941fbd65207fdfb190eb577595142a568
|
|
7
|
+
data.tar.gz: 499e01ccd183f9993386d4c4ba129b015189512a4f33551b651f0e4c20ef2ab80e5cfb5a5ab05e825d17b08e62ecdbfdae5584d0d16e108257a302e530761f59
|
data/lib/rbbt/tsv/excel.rb
CHANGED
|
@@ -1,14 +1,42 @@
|
|
|
1
1
|
require 'spreadsheet'
|
|
2
|
+
require 'rubyXL'
|
|
3
|
+
|
|
2
4
|
module TSV
|
|
3
|
-
|
|
5
|
+
|
|
6
|
+
def self._remove_link(value)
|
|
7
|
+
if value =~ /<([\w]+)[^>]*>(.*?)<\/\1>/
|
|
8
|
+
$2
|
|
9
|
+
else
|
|
10
|
+
value
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self._clean_float(v)
|
|
15
|
+
case v
|
|
16
|
+
when Float
|
|
17
|
+
v.to_s.sub(/e(-?\d+)$/,'E\1')
|
|
18
|
+
when String
|
|
19
|
+
if v =~ /^-?[\d\.]+e(-?\d+)$/
|
|
20
|
+
v.sub(/e(-?\d+)$/,'E\1')
|
|
21
|
+
else
|
|
22
|
+
v
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
v
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def self._excel_data(tsv, options ={})
|
|
31
|
+
options = Misc.add_defaults options, :sep2 => ', '
|
|
32
|
+
|
|
4
33
|
name = Misc.process_options options, :name
|
|
34
|
+
sep2 = Misc.process_options options, :sep2
|
|
35
|
+
unmerge = Misc.process_options options, :unmerge
|
|
5
36
|
sort_by = Misc.process_options options, :sort_by
|
|
6
37
|
sort_by_cast = Misc.process_options options, :sort_by_cast
|
|
7
|
-
|
|
38
|
+
remove_links = Misc.process_options options, :remove_links
|
|
8
39
|
|
|
9
|
-
book = Spreadsheet::Workbook.new
|
|
10
|
-
sheet1 = book.create_worksheet
|
|
11
|
-
sheet1.row(0).concat fields
|
|
12
40
|
i = 1
|
|
13
41
|
if sort_by
|
|
14
42
|
if sort_by_cast
|
|
@@ -26,7 +54,8 @@ module TSV
|
|
|
26
54
|
data = tsv
|
|
27
55
|
end
|
|
28
56
|
|
|
29
|
-
|
|
57
|
+
rows = []
|
|
58
|
+
data.through do |key, values|
|
|
30
59
|
cells = []
|
|
31
60
|
cells.push((name and key.respond_to?(:name)) ? key.name || key : key )
|
|
32
61
|
|
|
@@ -34,86 +63,173 @@ module TSV
|
|
|
34
63
|
values.each do |value|
|
|
35
64
|
v = (name and value.respond_to?(:name)) ? value.name || value : value
|
|
36
65
|
if Array === v
|
|
37
|
-
|
|
66
|
+
v = v.collect{|_v| _remove_link(_v)} if remove_links
|
|
67
|
+
v = v.collect{|_v| _clean_float(_v)}
|
|
68
|
+
if unmerge
|
|
69
|
+
cells.push v
|
|
70
|
+
else
|
|
71
|
+
cells.push v * sep2
|
|
72
|
+
end
|
|
38
73
|
else
|
|
74
|
+
v = remove_link(v) if remove_links
|
|
39
75
|
cells.push v
|
|
40
76
|
end
|
|
41
77
|
end
|
|
42
78
|
|
|
43
|
-
|
|
79
|
+
rows << cells
|
|
44
80
|
i += 1
|
|
45
81
|
end
|
|
46
|
-
|
|
82
|
+
if unmerge
|
|
83
|
+
new_rows = []
|
|
84
|
+
rows.each do |row|
|
|
85
|
+
header = row.shift
|
|
86
|
+
Misc.zip_fields(row).each do |values|
|
|
87
|
+
new_rows << [header] + values
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
rows = new_rows
|
|
91
|
+
end
|
|
92
|
+
[tsv.all_fields, rows]
|
|
47
93
|
end
|
|
48
94
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
95
|
+
module XLS
|
|
96
|
+
def self.read(file, options = {})
|
|
97
|
+
options = Misc.add_defaults options, :sep2 => /[,|]\s?/
|
|
98
|
+
sheet = Misc.process_options options, :sheet
|
|
99
|
+
header = Misc.process_options options, :header
|
|
100
|
+
|
|
101
|
+
header = true unless header == false
|
|
102
|
+
sheet ||= 0
|
|
103
|
+
TmpFile.with_file do |filename|
|
|
104
|
+
workbook = Spreadsheet.open Open.open(file)
|
|
105
|
+
sheet = workbook.worksheet sheet
|
|
106
|
+
|
|
107
|
+
rows = []
|
|
108
|
+
|
|
109
|
+
sheet.each do |row|
|
|
110
|
+
rows << row.values_at(0..(row.size - 1))
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
File.open(filename, 'w') do |f|
|
|
114
|
+
if header
|
|
115
|
+
header = rows.shift
|
|
116
|
+
f.puts "#" + header * "\t"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
rows.each do |row| f.puts row * "\t" end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
TSV.open(filename, options)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.write(tsv, file, options = {})
|
|
127
|
+
options = Misc.add_defaults options, :sheet => "Sheet1"
|
|
128
|
+
sheet = Misc.process_options options, :sheet
|
|
129
|
+
fields, rows = TSV._excel_data(tsv, options)
|
|
130
|
+
|
|
131
|
+
book = Spreadsheet::Workbook.new
|
|
132
|
+
sheet1 = book.create_worksheet
|
|
133
|
+
sheet1.name = sheet if sheet
|
|
134
|
+
|
|
135
|
+
sheet1.row(0).concat fields
|
|
136
|
+
|
|
137
|
+
rows.each_with_index do |cells,i|
|
|
138
|
+
sheet1.row(i+1).concat cells
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
book.write file
|
|
54
142
|
end
|
|
55
143
|
end
|
|
56
144
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
145
|
+
module XLSX
|
|
146
|
+
def self.read(file, options = {})
|
|
147
|
+
options = Misc.add_defaults options, :sep2 => /[,|]\s?/
|
|
148
|
+
sheet = Misc.process_options options, :sheet
|
|
149
|
+
header = Misc.process_options options, :header
|
|
62
150
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
151
|
+
header = true unless header == false
|
|
152
|
+
TmpFile.with_file do |filename|
|
|
153
|
+
workbook = RubyXL::Parser.parse file
|
|
154
|
+
sheet = sheet ? workbook[sheet] : workbook.worksheets.first
|
|
155
|
+
|
|
156
|
+
rows = []
|
|
157
|
+
|
|
158
|
+
sheet.each do |row|
|
|
159
|
+
rows << row.cells.collect{|c| c.value}
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
File.open(filename, 'w') do |f|
|
|
163
|
+
if header
|
|
164
|
+
header = rows.shift
|
|
165
|
+
f.puts "#" + header * "\t"
|
|
74
166
|
end
|
|
167
|
+
|
|
168
|
+
rows.each do |row| f.puts row * "\t" end
|
|
75
169
|
end
|
|
76
|
-
|
|
77
|
-
|
|
170
|
+
|
|
171
|
+
TSV.open(filename, options)
|
|
78
172
|
end
|
|
79
|
-
else
|
|
80
|
-
data = self
|
|
81
173
|
end
|
|
82
174
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
cells.push((name and key.respond_to?(:name)) ? key.name || key : key )
|
|
175
|
+
def self.write(tsv, file, options = {})
|
|
176
|
+
sheet = Misc.process_options options, :sheet
|
|
86
177
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
cells.push v
|
|
96
|
-
end
|
|
178
|
+
fields, rows = TSV._excel_data(tsv, options)
|
|
179
|
+
|
|
180
|
+
book = RubyXL::Workbook.new
|
|
181
|
+
sheet1 = book.worksheets.first
|
|
182
|
+
sheet1.sheet_name = sheet if sheet
|
|
183
|
+
|
|
184
|
+
fields.each_with_index do |e,i|
|
|
185
|
+
sheet1.add_cell(0, i, e)
|
|
97
186
|
end
|
|
98
187
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
v.to_s.sub(/e(-?\d+)$/,'E\1')
|
|
103
|
-
when String
|
|
104
|
-
if v =~ /^-?[\d\.]+e(-?\d+)$/
|
|
105
|
-
v.sub(/e(-?\d+)$/,'E\1')
|
|
106
|
-
else
|
|
107
|
-
v
|
|
108
|
-
end
|
|
109
|
-
else
|
|
110
|
-
v
|
|
188
|
+
rows.each_with_index do |cells,i|
|
|
189
|
+
cells.each_with_index do |e,j|
|
|
190
|
+
sheet1.add_cell(i+1, j, e)
|
|
111
191
|
end
|
|
112
192
|
end
|
|
113
193
|
|
|
114
|
-
|
|
115
|
-
|
|
194
|
+
book.write file
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def xls(filename, options ={})
|
|
199
|
+
TSV::XLS.write(self, filename, options)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def xlsx(filename, options ={})
|
|
203
|
+
TSV::XLSX.write(self, filename, options)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def excel(filename, options ={})
|
|
207
|
+
if filename =~ /\.xlsx$/
|
|
208
|
+
xlsx(filename, options)
|
|
209
|
+
else
|
|
210
|
+
xls(filename, options)
|
|
116
211
|
end
|
|
117
|
-
book.write filename
|
|
118
212
|
end
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def self.xls(filename, options ={})
|
|
216
|
+
TSV::XLS.read(filename, options)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def self.xlsx(filename, options ={})
|
|
220
|
+
TSV::XLSX.read(filename, options)
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def self.excel(filename, options = {})
|
|
224
|
+
if filename =~ /\.xlsx$/
|
|
225
|
+
xlsx(filename, options)
|
|
226
|
+
else
|
|
227
|
+
xls(filename, options)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def self.excel2tsv(filename, options ={})
|
|
232
|
+
excel(filename, options={})
|
|
233
|
+
end
|
|
234
|
+
|
|
119
235
|
end
|
data/lib/rbbt/util/excel2tsv.rb
CHANGED
|
@@ -1,33 +1,2 @@
|
|
|
1
|
-
require '
|
|
2
|
-
require 'rbbt/tsv'
|
|
3
|
-
require 'rbbt/util/tmpfile'
|
|
4
|
-
|
|
5
|
-
module TSV
|
|
6
|
-
def self.excel2tsv(file, options = {})
|
|
7
|
-
sheet = options.delete :sheet
|
|
8
|
-
header = options.delete :header
|
|
9
|
-
header = true unless header == false
|
|
10
|
-
sheet ||= 0
|
|
11
|
-
TmpFile.with_file do |filename|
|
|
12
|
-
workbook = Spreadsheet.open Open.open(file)
|
|
13
|
-
sheet = workbook.worksheet sheet
|
|
14
|
-
|
|
15
|
-
rows = []
|
|
16
|
-
|
|
17
|
-
sheet.each do |row|
|
|
18
|
-
rows << row.values_at(0..(row.size - 1))
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
File.open(filename, 'w') do |f|
|
|
22
|
-
if header
|
|
23
|
-
header = rows.shift
|
|
24
|
-
f.puts "#" + header * "\t"
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
rows.each do |row| f.puts row * "\t" end
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
TSV.open(filename, options)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
1
|
+
Log.warn "File #{__FILE__} is deprecated, please require 'rbbt/tsv/excel' instead"
|
|
2
|
+
require 'rbbt/tsv/excel'
|
data/lib/rbbt/util/open.rb
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rbbt-util'
|
|
4
|
+
require 'rbbt/util/simpleopt'
|
|
5
|
+
|
|
6
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
|
7
|
+
|
|
8
|
+
options = SOPT.setup <<EOF
|
|
9
|
+
|
|
10
|
+
Description
|
|
11
|
+
|
|
12
|
+
$ rbbt tsv read_excel [options] <filename.xls|filename.xlsx>
|
|
13
|
+
|
|
14
|
+
Use - to read from STDIN
|
|
15
|
+
|
|
16
|
+
-k--key_field* Key field
|
|
17
|
+
-f--fields* Fields
|
|
18
|
+
-t--type* Type
|
|
19
|
+
-m--merge Merge from multiple rows
|
|
20
|
+
-s2--sep2* Second level separator. Default /[,|]\\s?/
|
|
21
|
+
-h--help Print this help
|
|
22
|
+
|
|
23
|
+
EOF
|
|
24
|
+
if options[:help]
|
|
25
|
+
if defined? rbbt_usage
|
|
26
|
+
rbbt_usage
|
|
27
|
+
else
|
|
28
|
+
puts SOPT.doc
|
|
29
|
+
end
|
|
30
|
+
exit 0
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
excelfile = ARGV.first
|
|
34
|
+
|
|
35
|
+
raise ParameterException, "No excel file given" if excelfile.nil?
|
|
36
|
+
|
|
37
|
+
require 'rbbt/tsv/excel'
|
|
38
|
+
puts TSV.excel(excelfile, options).to_s
|
|
39
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'rbbt-util'
|
|
4
|
+
require 'rbbt/util/simpleopt'
|
|
5
|
+
|
|
6
|
+
$0 = "rbbt #{$previous_commands*""} #{ File.basename(__FILE__) }" if $previous_commands
|
|
7
|
+
|
|
8
|
+
options = SOPT.setup <<EOF
|
|
9
|
+
|
|
10
|
+
Description
|
|
11
|
+
|
|
12
|
+
$ rbbt tsv write_excel [options] <filename.tsv|-> <filename.xls|filename.xlsx>
|
|
13
|
+
|
|
14
|
+
Use - to read from STDIN
|
|
15
|
+
|
|
16
|
+
-k--key_field* Key field
|
|
17
|
+
-f--fields* Fields
|
|
18
|
+
-t--type* Type
|
|
19
|
+
-m--merge Merge from multiple rows
|
|
20
|
+
-um--unmerge Write the results unmerged
|
|
21
|
+
-W--workflows* Load a list of workflows
|
|
22
|
+
-R--requires* Require a list of files
|
|
23
|
+
-n--name Transform entities to human readible names
|
|
24
|
+
-h--help Print this help
|
|
25
|
+
|
|
26
|
+
EOF
|
|
27
|
+
if options[:help]
|
|
28
|
+
if defined? rbbt_usage
|
|
29
|
+
rbbt_usage
|
|
30
|
+
else
|
|
31
|
+
puts SOPT.doc
|
|
32
|
+
end
|
|
33
|
+
exit 0
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
if options[:workflows]
|
|
37
|
+
require 'rbbt/workflow'
|
|
38
|
+
workflows = options[:workflows].split(',')
|
|
39
|
+
workflows.each do |workflow|
|
|
40
|
+
workflow.strip!
|
|
41
|
+
Workflow.require_workflow workflow
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
if options[:requires]
|
|
46
|
+
requires = options[:requires].split(',')
|
|
47
|
+
requires.each do |req|
|
|
48
|
+
req.strip!
|
|
49
|
+
require req
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
tsvfile, excelfile = ARGV
|
|
54
|
+
|
|
55
|
+
excelfile, tsvfile = tsvfile, nil if excelfile.nil? and tsvfile =~ /\.(xls|xlsx)$/
|
|
56
|
+
|
|
57
|
+
raise ParameterException, "No files given" if tsvfile.nil? and excelfile.nil?
|
|
58
|
+
raise ParameterException, "No excel file given" if excelfile.nil?
|
|
59
|
+
|
|
60
|
+
require 'rbbt/tsv/excel'
|
|
61
|
+
TSV.open(tsvfile, options).excel(excelfile, options)
|
|
62
|
+
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), '../..', 'test_helper.rb')
|
|
2
|
+
require 'rbbt/tsv/excel'
|
|
3
|
+
|
|
4
|
+
class TestExcel < Test::Unit::TestCase
|
|
5
|
+
def _test_xls
|
|
6
|
+
content =<<-EOF
|
|
7
|
+
#Id ValueA ValueB OtherID
|
|
8
|
+
row1 a|aa|aaa b Id1|Id2
|
|
9
|
+
row2 A B Id3
|
|
10
|
+
EOF
|
|
11
|
+
|
|
12
|
+
TmpFile.with_file(content) do |filename|
|
|
13
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
|
14
|
+
TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
|
|
15
|
+
tsv.xls(excelfile)
|
|
16
|
+
new = TSV.xls(excelfile)
|
|
17
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def _test_xlsx
|
|
23
|
+
content =<<-EOF
|
|
24
|
+
#Id ValueA ValueB OtherID
|
|
25
|
+
row1 a|aa|aaa b Id1|Id2
|
|
26
|
+
row2 A B Id3
|
|
27
|
+
EOF
|
|
28
|
+
|
|
29
|
+
TmpFile.with_file(content) do |filename|
|
|
30
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
|
31
|
+
TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
|
|
32
|
+
tsv.xlsx(excelfile, :sheet => "Sheet1")
|
|
33
|
+
new = TSV.xlsx(excelfile, :sheet => "Sheet1")
|
|
34
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def _test_excel
|
|
40
|
+
content =<<-EOF
|
|
41
|
+
#Id ValueA ValueB OtherID
|
|
42
|
+
row1 a|aa|aaa b Id1|Id2
|
|
43
|
+
row2 A B Id3
|
|
44
|
+
EOF
|
|
45
|
+
|
|
46
|
+
TmpFile.with_file(content) do |filename|
|
|
47
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
|
48
|
+
TmpFile.with_file(nil, true, :extension => 'xlsx') do |excelfile|
|
|
49
|
+
tsv.xlsx(excelfile, :sheet => "Sheet1")
|
|
50
|
+
new = TSV.excel(excelfile, :sheet => "Sheet1")
|
|
51
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
52
|
+
new = TSV.xlsx(excelfile, :sheet => "Sheet1")
|
|
53
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
TmpFile.with_file(nil, true, :extension => 'xls') do |excelfile|
|
|
57
|
+
tsv.xls(excelfile, :sheet => "Sheet1")
|
|
58
|
+
new = TSV.excel(excelfile, :sheet => "Sheet1")
|
|
59
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
60
|
+
new = TSV.xls(excelfile, :sheet => "Sheet1")
|
|
61
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def _test_excel_sheets
|
|
67
|
+
content =<<-EOF
|
|
68
|
+
#Id ValueA ValueB OtherID
|
|
69
|
+
row1 a|aa|aaa b Id1|Id2
|
|
70
|
+
row2 A B Id3
|
|
71
|
+
EOF
|
|
72
|
+
|
|
73
|
+
TmpFile.with_file(content) do |filename|
|
|
74
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
|
75
|
+
|
|
76
|
+
TmpFile.with_file(nil, false, :extension => 'xlsx') do |excelfile|
|
|
77
|
+
tsv.xlsx(excelfile)
|
|
78
|
+
new = TSV.excel(excelfile)
|
|
79
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
80
|
+
|
|
81
|
+
tsv.xlsx(excelfile, :sheet => "Test")
|
|
82
|
+
new = TSV.excel(excelfile, :sheet => "Test")
|
|
83
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
84
|
+
|
|
85
|
+
tsv.xlsx(excelfile, :sheet => "Test")
|
|
86
|
+
new = TSV.excel(excelfile)
|
|
87
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
88
|
+
|
|
89
|
+
tsv.xlsx(excelfile)
|
|
90
|
+
new = TSV.excel(excelfile, :sheet => "Sheet1")
|
|
91
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
TmpFile.with_file(nil, false, :extension => 'xls') do |excelfile|
|
|
96
|
+
tsv.xls(excelfile)
|
|
97
|
+
new = TSV.excel(excelfile)
|
|
98
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
99
|
+
|
|
100
|
+
tsv.xls(excelfile, :sheet => "Test")
|
|
101
|
+
new = TSV.excel(excelfile, :sheet => "Test")
|
|
102
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
103
|
+
|
|
104
|
+
tsv.xls(excelfile, :sheet => "Test")
|
|
105
|
+
new = TSV.excel(excelfile)
|
|
106
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
107
|
+
|
|
108
|
+
tsv.xls(excelfile)
|
|
109
|
+
new = TSV.excel(excelfile, :sheet => "Sheet1")
|
|
110
|
+
assert_equal %w(row1 row2), new.keys.sort
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_excel_unmerge
|
|
116
|
+
content =<<-EOF
|
|
117
|
+
#Id ValueA ValueB OtherID
|
|
118
|
+
row1 a|aa b|bb Id1|Id2
|
|
119
|
+
row2 A B Id3
|
|
120
|
+
EOF
|
|
121
|
+
|
|
122
|
+
TmpFile.with_file(content) do |filename|
|
|
123
|
+
tsv = TSV.open(filename, :sep => /\s+/)
|
|
124
|
+
|
|
125
|
+
TmpFile.with_file(nil, false, :extension => 'xlsx') do |excelfile|
|
|
126
|
+
tsv.xlsx(excelfile, :unmerge => true)
|
|
127
|
+
|
|
128
|
+
new = TSV.excel(excelfile, :merge => false)
|
|
129
|
+
assert_equal %w(a), new["row1"]["ValueA"]
|
|
130
|
+
|
|
131
|
+
new = TSV.excel(excelfile, :merge => true)
|
|
132
|
+
assert_equal %w(a aa), new["row1"]["ValueA"]
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rbbt-util
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.21.
|
|
4
|
+
version: 5.21.57
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Miguel Vazquez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-11-
|
|
11
|
+
date: 2016-11-30 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -360,11 +360,13 @@ files:
|
|
|
360
360
|
- share/rbbt_commands/tsv/json
|
|
361
361
|
- share/rbbt_commands/tsv/query
|
|
362
362
|
- share/rbbt_commands/tsv/read
|
|
363
|
+
- share/rbbt_commands/tsv/read_excel
|
|
363
364
|
- share/rbbt_commands/tsv/slice
|
|
364
365
|
- share/rbbt_commands/tsv/sort
|
|
365
366
|
- share/rbbt_commands/tsv/subset
|
|
366
367
|
- share/rbbt_commands/tsv/unzip
|
|
367
368
|
- share/rbbt_commands/tsv/values
|
|
369
|
+
- share/rbbt_commands/tsv/write_excel
|
|
368
370
|
- share/rbbt_commands/tsv/zip
|
|
369
371
|
- share/rbbt_commands/watch
|
|
370
372
|
- share/rbbt_commands/workflow/cmd
|
|
@@ -421,6 +423,7 @@ files:
|
|
|
421
423
|
- test/rbbt/tsv/test_accessor.rb
|
|
422
424
|
- test/rbbt/tsv/test_attach.rb
|
|
423
425
|
- test/rbbt/tsv/test_change_id.rb
|
|
426
|
+
- test/rbbt/tsv/test_excel.rb
|
|
424
427
|
- test/rbbt/tsv/test_field_index.rb
|
|
425
428
|
- test/rbbt/tsv/test_filter.rb
|
|
426
429
|
- test/rbbt/tsv/test_index.rb
|
|
@@ -559,6 +562,7 @@ test_files:
|
|
|
559
562
|
- test/rbbt/tsv/test_parser.rb
|
|
560
563
|
- test/rbbt/tsv/test_stream.rb
|
|
561
564
|
- test/rbbt/tsv/test_util.rb
|
|
565
|
+
- test/rbbt/tsv/test_excel.rb
|
|
562
566
|
- test/rbbt/tsv/test_accessor.rb
|
|
563
567
|
- test/rbbt/tsv/test_filter.rb
|
|
564
568
|
- test/rbbt/tsv/test_attach.rb
|