rbbt-util 5.21.56 → 5.21.57
Sign up to get free protection for your applications and to get access to all the features.
- 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
|