swak 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/swak/table.rb +68 -22
- metadata +2 -2
data/lib/swak/table.rb
CHANGED
@@ -1,43 +1,84 @@
|
|
1
1
|
module Swak
|
2
2
|
module Table
|
3
|
-
|
3
|
+
class SmartRow
|
4
|
+
attr_reader :header, :fields, :colmap
|
5
|
+
|
6
|
+
def initialize(header, fields)
|
7
|
+
if header.size != fields.size
|
8
|
+
raise "Header and field size mismatch in SmartRow.new #{header.inspect} vs #{fields.inspect}"
|
9
|
+
end
|
10
|
+
|
11
|
+
@header = header
|
12
|
+
@fields = fields
|
13
|
+
@colmap = {}
|
14
|
+
header.each_with_index {|fieldname, i| @colmap[fieldname] = i}
|
15
|
+
if @colmap.size != @header.size
|
16
|
+
raise "Duplicate field names not allowed in SmartRow header"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def [](*args)
|
21
|
+
if args.size == 1 && args[0].is_a?(String)
|
22
|
+
@fields[@colmap[args[0]]]
|
23
|
+
else
|
24
|
+
@fields[*args]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def []=(*args)
|
29
|
+
if args.size == 2 && args[0].is_a?(String)
|
30
|
+
@fields[@colmap[args[0]]] = args[-1]
|
31
|
+
else
|
32
|
+
@fields.[]=(*args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def method_missing(sym, *args, &block)
|
37
|
+
@fields.send(sym, *args, &block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def Table.read(io_or_fn, opts={:has_header => false, :type => String, :delim => "\t", :smart => false})
|
4
43
|
if io_or_fn.is_a?(String)
|
5
44
|
io = File.new(io_or_fn)
|
6
45
|
else
|
7
46
|
io = io_or_fn
|
8
47
|
end
|
9
|
-
if opts[:has_header]
|
10
|
-
header = io.gets
|
11
|
-
opts[:header] = header
|
48
|
+
if opts[:has_header] || opts[:smart]
|
49
|
+
header = io.gets.chomp
|
50
|
+
opts[:header] = header
|
12
51
|
end
|
13
52
|
|
14
53
|
table = []
|
15
54
|
delim = opts[:delim] || "\t"
|
16
55
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
56
|
+
case opts[:type].to_s
|
57
|
+
when "Integer"
|
58
|
+
ele_proc = Proc.new{|ele| ele.to_i_strict}
|
59
|
+
when "Float"
|
60
|
+
ele_proc = Proc.new{|ele| ele.to_f_strict}
|
61
|
+
else
|
62
|
+
ele_proc = Proc.new{|ele| ele} # By default, don't format
|
63
|
+
end
|
64
|
+
|
65
|
+
if opts[:smart]
|
66
|
+
row_proc = Proc.new{|row| SmartRow.new(header.split(delim), row) }
|
67
|
+
else
|
68
|
+
row_proc = Proc.new{|row| row}
|
69
|
+
end
|
70
|
+
|
71
|
+
for line in io
|
72
|
+
line.chomp!
|
73
|
+
f = line.split(delim)
|
74
|
+
table << row_proc.call(f.map(&ele_proc))
|
34
75
|
end
|
35
76
|
|
36
77
|
return table
|
37
78
|
end
|
38
79
|
|
39
80
|
def Table.write(table, io_or_fn, opts={:header => nil, :fmt => nil, :delim => "\t"})
|
40
|
-
raise "Illegal fmt in Swak::Table.write" if !opts[:fmt].nil? && !opts[:fmt].is_a?(String)
|
81
|
+
raise "Illegal fmt in Swak::Table.write: #{opts.inspect}" if !opts[:fmt].nil? && !opts[:fmt].is_a?(String)
|
41
82
|
|
42
83
|
delim = opts[:delim] || "\t"
|
43
84
|
|
@@ -68,6 +109,7 @@ module Swak
|
|
68
109
|
|
69
110
|
def Table.transpose(table)
|
70
111
|
raise "Error in Swak::Table.transpose(): Cannot transpose nil table" if table.nil?
|
112
|
+
raise "Error in Swak::Table.transpose(): Cannot transpose a SmartRow table (yet)" if table.size > 0 && table[0].is_a?(SmartRow)
|
71
113
|
return [] if table.size == 0
|
72
114
|
|
73
115
|
num_rows = table.size
|
@@ -92,5 +134,9 @@ module Swak
|
|
92
134
|
|
93
135
|
return out_mat
|
94
136
|
end
|
137
|
+
|
138
|
+
def Table.column(table, col)
|
139
|
+
table.map {|row| row[col]}
|
140
|
+
end
|
95
141
|
end
|
96
142
|
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: swak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jesse Rodriguez
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-07-
|
13
|
+
date: 2012-07-22 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Random tools and mixins
|