bio-table 0.0.1
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/.document +5 -0
- data/.rspec +1 -0
- data/.travis.yml +12 -0
- data/Gemfile +18 -0
- data/LICENSE.txt +20 -0
- data/README.md +283 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/bin/bio-table +141 -0
- data/features/bio-table-csv-reader-feature.rb +28 -0
- data/features/bio-table-csv-reader.feature +22 -0
- data/features/step_definitions/bio-table_steps.rb +0 -0
- data/features/support/env.rb +13 -0
- data/lib/bio-table.rb +23 -0
- data/lib/bio-table/columns.rb +11 -0
- data/lib/bio-table/diff.rb +30 -0
- data/lib/bio-table/filter.rb +57 -0
- data/lib/bio-table/formatter.rb +28 -0
- data/lib/bio-table/overlap.rb +1 -0
- data/lib/bio-table/parser.rb +22 -0
- data/lib/bio-table/table.rb +121 -0
- data/lib/bio-table/tablereader.rb +13 -0
- data/lib/bio-table/tablerow.rb +29 -0
- data/lib/bio-table/tablewriter.rb +6 -0
- data/lib/bio-table/validator.rb +26 -0
- data/spec/bio-table_spec.rb +7 -0
- data/spec/spec_helper.rb +12 -0
- data/test/data/input/table1.csv +381 -0
- metadata +168 -0
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 1.9.2
|
4
|
+
- 1.9.3
|
5
|
+
- jruby-19mode # JRuby in 1.9 mode
|
6
|
+
- rbx-19mode
|
7
|
+
# - 1.8.7
|
8
|
+
# - jruby-18mode # JRuby in 1.8 mode
|
9
|
+
# - rbx-18mode
|
10
|
+
|
11
|
+
# uncomment this line if your project needs to run something other than `rake`:
|
12
|
+
# script: bundle exec rspec spec
|
data/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
gem "bio-logger"
|
7
|
+
|
8
|
+
# Add dependencies to develop your gem here.
|
9
|
+
# Include everything needed to run rake, tests, features, etc.
|
10
|
+
group :development do
|
11
|
+
gem "rspec", "~> 2.8.0"
|
12
|
+
gem "rdoc", "~> 3.12"
|
13
|
+
gem "cucumber", ">= 0"
|
14
|
+
gem "bundler", "> 1.0.0"
|
15
|
+
gem "jeweler", "~> 1.8.3"
|
16
|
+
gem "bio", ">= 1.4.2"
|
17
|
+
gem "rdoc", "~> 3.12"
|
18
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 Pjotr Prins
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,283 @@
|
|
1
|
+
# bio-table
|
2
|
+
|
3
|
+
[](http://travis-ci.org/pjotrp/bioruby-table)
|
4
|
+
|
5
|
+
Tables of data are often used in bioinformatics, especially in
|
6
|
+
conjunction with Excel spreadsheets and DB queries. This biogem
|
7
|
+
contains support for reading tables, writing tables, and manipulation
|
8
|
+
of rows and columns, both using a command line interface and through a
|
9
|
+
Ruby library. If you don't like R dataframes, maybe you like this.
|
10
|
+
Also, because bio-table is command line driven, it easily fits in a
|
11
|
+
pipe-line setup.
|
12
|
+
|
13
|
+
Quick example, say we want to filter out rows that contain certain
|
14
|
+
p-values listed in the 4th column:
|
15
|
+
|
16
|
+
```
|
17
|
+
bio-table test/data/input/table1.csv --num-filter "values[3] <= 0.05"
|
18
|
+
```
|
19
|
+
|
20
|
+
bio-table should be lazy, be good for big data, and the library
|
21
|
+
support a functional style of programming. You don't need to know Ruby
|
22
|
+
to use the command line interface (CLI).
|
23
|
+
|
24
|
+
Note: this software is under active development!
|
25
|
+
|
26
|
+
## Installation
|
27
|
+
|
28
|
+
```sh
|
29
|
+
gem install bio-table
|
30
|
+
```
|
31
|
+
|
32
|
+
## The command line interface (CLI)
|
33
|
+
|
34
|
+
### Transforming a table
|
35
|
+
|
36
|
+
Tables can be transformed through the command line. To transform a
|
37
|
+
comma separated file to a tab delimited one
|
38
|
+
|
39
|
+
```
|
40
|
+
bio-table test/data/input/table1.csv --in-format csv --format tab > test1.tab
|
41
|
+
```
|
42
|
+
|
43
|
+
Tab is actually the general default. Still, if the file name ends in
|
44
|
+
csv, it will assume CSV. To convert the table back
|
45
|
+
|
46
|
+
```
|
47
|
+
bio-table test1.tab --format csv > table1.csv
|
48
|
+
```
|
49
|
+
|
50
|
+
To filter out rows that contain certain values
|
51
|
+
|
52
|
+
```
|
53
|
+
bio-table test/data/input/table1.csv --num-filter "values[3] <= 0.05" > test1a.tab
|
54
|
+
```
|
55
|
+
|
56
|
+
The filter ignores the header row, and the row names. If you need
|
57
|
+
either, use the switches --with-header and --with-rownames. With math, list all rows
|
58
|
+
|
59
|
+
```
|
60
|
+
bio-table test/data/input/table1.csv --num-filter "values[3]-values[6] >= 0.05" > test1a.tab
|
61
|
+
```
|
62
|
+
|
63
|
+
or, list all rows that have a least a field with values >= 1000.0
|
64
|
+
|
65
|
+
```
|
66
|
+
bio-table test/data/input/table1.csv --num-filter "values.max >= 1000.0" > test1a.tab
|
67
|
+
```
|
68
|
+
|
69
|
+
Produce all rows that have at least 3 values above 3.0 and 1 one value
|
70
|
+
above 10.0:
|
71
|
+
|
72
|
+
```
|
73
|
+
bio-table test/data/input/table1.csv --num-filter "values.max >= 10.0 and values.count{|x| x>=3.0} > 3"
|
74
|
+
```
|
75
|
+
|
76
|
+
How is that for expressiveness? Looks like Ruby to me.
|
77
|
+
|
78
|
+
The --num-filter will convert fields lazily to numerical values (only
|
79
|
+
valid numbers are converted). If there are NA (nil) values in the table, you
|
80
|
+
may wish to remove them, like this
|
81
|
+
|
82
|
+
```
|
83
|
+
bio-table test/data/input/table1.csv --num-filter "values[0..12].compact.max >= 1000.0" > test1a.tab
|
84
|
+
```
|
85
|
+
|
86
|
+
which takes the first 13 fields and compact removes the nil values.
|
87
|
+
|
88
|
+
Also string comparisons and regular expressions can be used. E.g.
|
89
|
+
filter on rownames and a row field both containing 'BGT'
|
90
|
+
|
91
|
+
```
|
92
|
+
# not yet implemented
|
93
|
+
bio-table test/data/input/table1.csv --filter "rowname =~ /BGT/ and field[1] =~ /BGT/" > test1a.tab
|
94
|
+
```
|
95
|
+
|
96
|
+
To reorder/reduce table columns by name
|
97
|
+
|
98
|
+
```
|
99
|
+
bio-table test/data/input/table1.csv --columns AJ,B6,Axb1,Axb4,AXB13,Axb15,Axb19 > test1a.tab
|
100
|
+
```
|
101
|
+
|
102
|
+
or use their index numbers
|
103
|
+
|
104
|
+
```
|
105
|
+
bio-table test/data/input/table1.csv --columns 0,1,8,2,4,6 > test1a.tab
|
106
|
+
```
|
107
|
+
|
108
|
+
### Sorting a table
|
109
|
+
|
110
|
+
To sort a table on column 4 and 2
|
111
|
+
|
112
|
+
```
|
113
|
+
# not yet implemented
|
114
|
+
bio-table test/data/input/table1.csv --sort 4,2 > test1a.tab
|
115
|
+
```
|
116
|
+
|
117
|
+
Note: not all is implemented (just yet). Please check bio-table --help first.
|
118
|
+
|
119
|
+
### Combining a table
|
120
|
+
|
121
|
+
You can combine/concat tables by passing in multiple file names
|
122
|
+
|
123
|
+
bio-table test/data/input/table1.csv test/data/input/table2.csv
|
124
|
+
|
125
|
+
assuming they have the same headers (you can use the --columns switch!)
|
126
|
+
|
127
|
+
### Splitting a table
|
128
|
+
|
129
|
+
Splitting a table by column is possible by named or indexed columns,
|
130
|
+
see the --columns switch.
|
131
|
+
|
132
|
+
more soon
|
133
|
+
|
134
|
+
### Diffing and overlapping tables
|
135
|
+
|
136
|
+
With two tables it may be interesting to see the differences, or
|
137
|
+
overlap, based on shared columns. The bio-table diff command shows the
|
138
|
+
difference between two tables using the row names (i.e. those rows
|
139
|
+
with rownames that appear in table2, but not in table1)
|
140
|
+
|
141
|
+
bio-table --diff 0 table1.csv table2.csv
|
142
|
+
|
143
|
+
To find it the other way, switch the file names
|
144
|
+
|
145
|
+
bio-table --diff 0 table1.csv table2.csv
|
146
|
+
|
147
|
+
To diff on something else
|
148
|
+
|
149
|
+
bio-table --diff 0,3 table2.csv table1.csv
|
150
|
+
|
151
|
+
creates a (hopefully unique) key using columns 0 and 3 (0 is the rownames column).
|
152
|
+
|
153
|
+
Similarly
|
154
|
+
|
155
|
+
bio-table --overlap 2 table1.csv table2.csv
|
156
|
+
|
157
|
+
finds the overlapping rows, based on column 2 (NYI)
|
158
|
+
|
159
|
+
### Different parsers
|
160
|
+
|
161
|
+
more soon
|
162
|
+
|
163
|
+
## Usage
|
164
|
+
|
165
|
+
```ruby
|
166
|
+
require 'bio-table'
|
167
|
+
include BioTable
|
168
|
+
```
|
169
|
+
|
170
|
+
### Reading, transforming, and writing a table
|
171
|
+
|
172
|
+
Note: the Ruby API below is a work in progress.
|
173
|
+
|
174
|
+
Tables are two dimensional matrixes, which can be read from a file
|
175
|
+
|
176
|
+
```
|
177
|
+
t = Table.read_file('test/data/input/table1.csv')
|
178
|
+
p t.header # print the header array
|
179
|
+
p t.name[0],t[0] # print the row name and row row
|
180
|
+
p t[0][0] # print the top corner field
|
181
|
+
```
|
182
|
+
|
183
|
+
The table reader has quite a few options for defining field separator,
|
184
|
+
which column to use for names etc. More interestingly you can pass a
|
185
|
+
function to limit the amount of row read into memory:
|
186
|
+
|
187
|
+
```
|
188
|
+
t = Table.read_file('test/data/input/table1.csv',
|
189
|
+
:by_row => { | row | row[0..3] } )
|
190
|
+
```
|
191
|
+
|
192
|
+
will create a table of the column name +row[0]+ and 2 table fields. You can use
|
193
|
+
the same idea to reformat and reorder table columns when reading data
|
194
|
+
into the table. E.g.
|
195
|
+
|
196
|
+
```
|
197
|
+
t = Table.read_file('test/data/input/table1.csv',
|
198
|
+
:by_row => { | row | [row.rowname, row[0..3], row[6].to_i].flatten } )
|
199
|
+
```
|
200
|
+
|
201
|
+
When a header can not be transformed, it may fail. You can test for
|
202
|
+
the header with row.header?, but in this case you
|
203
|
+
can pass in a :by_header, which will have :by_row only call on
|
204
|
+
actual table rows.
|
205
|
+
|
206
|
+
```
|
207
|
+
t = Table.read_file('test/data/input/table1.csv',
|
208
|
+
:by_header => { | header | ["Row name", header[0..3], header[6]].flatten } )
|
209
|
+
:by_row => { | row | [row.rowname, row[0..3], row[6].to_i].flatten } )
|
210
|
+
```
|
211
|
+
|
212
|
+
When by_row returns nil or false, the table row is skipped. One way to
|
213
|
+
transform a file, and not loading it in memory, is
|
214
|
+
|
215
|
+
```
|
216
|
+
f = File.new('test.tab','w')
|
217
|
+
t = Table.read_file('test/data/input/table1.csv',
|
218
|
+
:by_row => { | row |
|
219
|
+
TableRow::write(f,[row.rowname,row[0..3],row[6].to_i].flatten, :separator => "\t")
|
220
|
+
nil # don't create a table in memory, effectively a filter
|
221
|
+
})
|
222
|
+
```
|
223
|
+
|
224
|
+
Another function is :filter which only acts on rows, but can not
|
225
|
+
transform them.
|
226
|
+
|
227
|
+
To write a full table from memory to file use
|
228
|
+
|
229
|
+
```
|
230
|
+
t.write_file('test1a.csv')
|
231
|
+
```
|
232
|
+
|
233
|
+
again columns can be reordered/transformed using a function. Another
|
234
|
+
option is by passing in an list of column numbers or header names, so
|
235
|
+
only those get written, e.g.
|
236
|
+
|
237
|
+
```
|
238
|
+
t.write_file('test1a.csv', columns: [0,1,2,4,6,8])
|
239
|
+
t.write_file('test1b.csv', columns: ["AJ","B6","Axb1","Axb4","AXB13","Axb15","Axb19"] )
|
240
|
+
```
|
241
|
+
|
242
|
+
other options are available for excluding row names (rownames: false), etc.
|
243
|
+
|
244
|
+
To sort a table file, the current routine is to load the file in
|
245
|
+
memory and sort according to table columns. In the near future we aim
|
246
|
+
to have a low-memory version, by reading only the sorting columns in
|
247
|
+
memory, and indexing them before writing output. That means reading a
|
248
|
+
file twice, but being able to handle much larger data.
|
249
|
+
|
250
|
+
### Loading a numerical matrix
|
251
|
+
|
252
|
+
Coming soon
|
253
|
+
|
254
|
+
### More...
|
255
|
+
|
256
|
+
The API doc is online. For more code examples see the test files in
|
257
|
+
the source tree.
|
258
|
+
|
259
|
+
|
260
|
+
## Project home page
|
261
|
+
|
262
|
+
Information on the source tree, documentation, examples, issues and
|
263
|
+
how to contribute, see
|
264
|
+
|
265
|
+
http://github.com/pjotrp/bioruby-table
|
266
|
+
|
267
|
+
The BioRuby community is on IRC server: irc.freenode.org, channel: #bioruby.
|
268
|
+
|
269
|
+
## Cite
|
270
|
+
|
271
|
+
If you use this software, please cite one of
|
272
|
+
|
273
|
+
* [BioRuby: bioinformatics software for the Ruby programming language](http://dx.doi.org/10.1093/bioinformatics/btq475)
|
274
|
+
* [Biogem: an effective tool-based approach for scaling up open source software development in bioinformatics](http://dx.doi.org/10.1093/bioinformatics/bts080)
|
275
|
+
|
276
|
+
## Biogems.info
|
277
|
+
|
278
|
+
This Biogem is published at [#bio-table](http://biogems.info/index.html)
|
279
|
+
|
280
|
+
## Copyright
|
281
|
+
|
282
|
+
Copyright (c) 2012 Pjotr Prins. See LICENSE.txt for further details.
|
283
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
begin
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
rescue Bundler::BundlerError => e
|
8
|
+
$stderr.puts e.message
|
9
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
+
exit e.status_code
|
11
|
+
end
|
12
|
+
require 'rake'
|
13
|
+
|
14
|
+
require 'jeweler'
|
15
|
+
Jeweler::Tasks.new do |gem|
|
16
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
+
gem.name = "bio-table"
|
18
|
+
gem.homepage = "http://github.com/pjotrp/bioruby-table"
|
19
|
+
gem.license = "MIT"
|
20
|
+
gem.summary = %Q{Transforming/filtering tab/csv files}
|
21
|
+
gem.description = %Q{Functions and tools for tranforming and changing tab delimited and comma separated table files - useful for Excel sheets and SQL/RDF output}
|
22
|
+
gem.email = "pjotr.public01@thebird.nl"
|
23
|
+
gem.authors = ["Pjotr Prins"]
|
24
|
+
# dependencies defined in Gemfile
|
25
|
+
end
|
26
|
+
Jeweler::RubygemsDotOrgTasks.new
|
27
|
+
|
28
|
+
require 'rspec/core'
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
36
|
+
spec.rcov = true
|
37
|
+
end
|
38
|
+
|
39
|
+
require 'cucumber/rake/task'
|
40
|
+
Cucumber::Rake::Task.new do |features|
|
41
|
+
end
|
42
|
+
|
43
|
+
task :test => [ :cucumber ]
|
44
|
+
|
45
|
+
task :default => :test
|
46
|
+
|
47
|
+
require 'rdoc/task'
|
48
|
+
Rake::RDocTask.new do |rdoc|
|
49
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
50
|
+
|
51
|
+
rdoc.rdoc_dir = 'rdoc'
|
52
|
+
rdoc.title = "bio-table #{version}"
|
53
|
+
rdoc.rdoc_files.include('README*')
|
54
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
55
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/bio-table
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# BioRuby bio-table Plugin BioTable
|
4
|
+
# Author:: Pjotr Prins
|
5
|
+
# Copyright:: 2012
|
6
|
+
|
7
|
+
rootpath = File.dirname(File.dirname(__FILE__))
|
8
|
+
$: << File.join(rootpath,'lib')
|
9
|
+
|
10
|
+
_VERSION = File.new(File.join(rootpath,'VERSION')).read.chomp
|
11
|
+
|
12
|
+
$stderr.print "bio-table "+_VERSION+" Copyright (C) 2012 Pjotr Prins <pjotr.prins@thebird.nl>\n\n"
|
13
|
+
|
14
|
+
USAGE =<<EOU
|
15
|
+
|
16
|
+
bio-table transforms, filters and reorders table files (CSV, tab-delimited).
|
17
|
+
|
18
|
+
EOU
|
19
|
+
|
20
|
+
if ARGV.size == 0
|
21
|
+
print USAGE
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'bio-table'
|
25
|
+
require 'optparse'
|
26
|
+
require 'bio-logger'
|
27
|
+
|
28
|
+
log = Bio::Log::LoggerPlus.new 'bio-table'
|
29
|
+
# log.outputters = Bio::Log::Outputter.stderr
|
30
|
+
|
31
|
+
Bio::Log::CLI.logger('stderr')
|
32
|
+
Bio::Log::CLI.trace('info')
|
33
|
+
|
34
|
+
options = {show_help: false, write_header: true}
|
35
|
+
options[:show_help] = true if ARGV.size == 0
|
36
|
+
opts = OptionParser.new do |o|
|
37
|
+
o.banner = "Usage: #{File.basename($0)} [options] filename\n\n"
|
38
|
+
|
39
|
+
o.on('--in-format [tab,csv]', [:tab, :csv], 'Input format (default tab)') do |par|
|
40
|
+
options[:in_format] = par.to_sym
|
41
|
+
end
|
42
|
+
|
43
|
+
o.on('--format [tab,csv]', [:tab, :csv], 'Output format (default tab)') do |par|
|
44
|
+
options[:format] = par.to_sym
|
45
|
+
end
|
46
|
+
|
47
|
+
o.on('--num-filter func', 'Numeric filtering function') do |par|
|
48
|
+
options[:num_filter] = par
|
49
|
+
end
|
50
|
+
|
51
|
+
o.on('--columns list', Array, 'List of column names or indices') do |l|
|
52
|
+
options[:columns] = l
|
53
|
+
end
|
54
|
+
|
55
|
+
o.on('--diff list',Array,'Diff two input files on columns') do |l|
|
56
|
+
options[:diff] = l
|
57
|
+
end
|
58
|
+
|
59
|
+
o.on('--overlap list',Array,'Find overlap of two input files on columns)') do |l|
|
60
|
+
options[:overlap] = l
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
# o.on('--with-header','Include the header element in filtering etc.') do
|
65
|
+
# options[:with_header] = true
|
66
|
+
# end
|
67
|
+
|
68
|
+
o.on('--with-rownames','Include the rownames in filtering etc.') do
|
69
|
+
options[:with_rownames] = true
|
70
|
+
end
|
71
|
+
|
72
|
+
o.separator ""
|
73
|
+
|
74
|
+
o.on("--logger filename",String,"Log to file (default stderr)") do | name |
|
75
|
+
Bio::Log::CLI.logger(name)
|
76
|
+
end
|
77
|
+
|
78
|
+
o.on("--trace options",String,"Set log level (default INFO, see bio-logger)") do | s |
|
79
|
+
Bio::Log::CLI.trace(s)
|
80
|
+
end
|
81
|
+
|
82
|
+
o.on("-q", "--quiet", "Run quietly") do |q|
|
83
|
+
Bio::Log::CLI.trace('error')
|
84
|
+
end
|
85
|
+
|
86
|
+
o.on("-v", "--verbose", "Run verbosely") do |v|
|
87
|
+
Bio::Log::CLI.trace('info')
|
88
|
+
end
|
89
|
+
|
90
|
+
o.on("--debug", "Show debug messages") do |v|
|
91
|
+
Bio::Log::CLI.trace('debug')
|
92
|
+
end
|
93
|
+
|
94
|
+
o.separator ""
|
95
|
+
|
96
|
+
o.on_tail('-h', '--help', 'Display this help and exit') do
|
97
|
+
options[:show_help] = true
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
begin
|
102
|
+
opts.parse!(ARGV)
|
103
|
+
|
104
|
+
if options[:show_help]
|
105
|
+
print opts
|
106
|
+
print USAGE
|
107
|
+
end
|
108
|
+
|
109
|
+
# TODO: your code here
|
110
|
+
# use options for your logic
|
111
|
+
rescue OptionParser::InvalidOption => e
|
112
|
+
options[:invalid_argument] = e.message
|
113
|
+
end
|
114
|
+
|
115
|
+
Bio::Log::CLI.configure('bio-table')
|
116
|
+
logger = Bio::Log::LoggerPlus['bio-table']
|
117
|
+
logger.info [options, ARGV]
|
118
|
+
|
119
|
+
include BioTable
|
120
|
+
|
121
|
+
if options[:diff]
|
122
|
+
logger.warn "Column settings are ignored for --diff" if options[:columns]
|
123
|
+
logger.warn "Ignoring extraneaousfiles" if ARGV.size>2
|
124
|
+
t1 = TableReader::read_file(ARGV[0], options)
|
125
|
+
t2 = TableReader::read_file(ARGV[1], options)
|
126
|
+
t = Diff::diff_tables(t1,t2, options)
|
127
|
+
t.write(options)
|
128
|
+
exit
|
129
|
+
end
|
130
|
+
|
131
|
+
if options[:overlap]
|
132
|
+
logger.warn "Column settings are ignored for --overlap" if options[:columns]
|
133
|
+
exit
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
ARGV.each do | fn |
|
138
|
+
t = TableReader::read_file(fn, options)
|
139
|
+
t.write(options)
|
140
|
+
options[:write_header] = false # don't write the header for chained files
|
141
|
+
end
|