tabular 0.3.0 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/tabular/column_mapper.rb +26 -0
- data/lib/tabular/tables/file_reading.rb +92 -0
- data/lib/tabular/version.rb +1 -1
- data/tabular.gemspec +3 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d85c0fe883103fa87b589ba84cfdd385ce914133
|
4
|
+
data.tar.gz: 38277554d2f6a15b6a2b937b4dac167306b58bad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8551d9980fbd71a1a720c39405d3f3ed93bb34d1fb3b2a963efafb6196f73c8179bbaa064460a57176583ca831c1dfcbf389ae172ee9bda62a829bb1e6a7a2d
|
7
|
+
data.tar.gz: 6ad55481d57a25b1f4d502bd96488d2fbd7e136423ec86ff1877b0c13dc75307afa48d4b9ddfbd4b01583c207e39d28252d417727b16ac4d7c0a06cda1f452bc
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Tabular
|
2
|
+
class ColumnMapper
|
3
|
+
include Tabular::Blank
|
4
|
+
|
5
|
+
# Convert +key+ to normalized symbol. Subclass for more complex mapping.
|
6
|
+
def map(key)
|
7
|
+
return nil if is_blank?(key)
|
8
|
+
symbolize key
|
9
|
+
end
|
10
|
+
|
11
|
+
def symbolize(key)
|
12
|
+
begin
|
13
|
+
key.to_s.strip.gsub(/::/, '/').
|
14
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
15
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
16
|
+
tr("-", "_").
|
17
|
+
gsub(/ +/, "_").
|
18
|
+
gsub(";", "").
|
19
|
+
downcase.
|
20
|
+
to_sym
|
21
|
+
rescue
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Tabular
|
2
|
+
module Tables
|
3
|
+
module FileReading
|
4
|
+
# +file+ : file path as String or File
|
5
|
+
# Assumes .txt = tab-delimited, .csv = CSV, .xls = Excel. Assumes first row is the header.
|
6
|
+
# Normalizes column names to lower-case with underscores.
|
7
|
+
# +format+ : :csv, :txt, or :xls
|
8
|
+
# Returns Array of Arrays
|
9
|
+
def read(file, format = nil)
|
10
|
+
file_path = to_file_path(file)
|
11
|
+
format ||= format_from(format, file_path)
|
12
|
+
|
13
|
+
self.rows = case format
|
14
|
+
when :xls, :xlsx
|
15
|
+
read_spreadsheet file_path, format
|
16
|
+
when :txt
|
17
|
+
read_txt file_path
|
18
|
+
when :csv
|
19
|
+
read_csv file_path
|
20
|
+
else
|
21
|
+
raise "Cannot read '#{format}' format. Expected :xls, :xlsx, :txt, or :csv"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def format_from(as_option, file_path)
|
26
|
+
if as_option
|
27
|
+
as_option
|
28
|
+
else
|
29
|
+
case File.extname(file_path)
|
30
|
+
when ".xls"
|
31
|
+
:xls
|
32
|
+
when ".xlsx"
|
33
|
+
:xlsx
|
34
|
+
when ".txt"
|
35
|
+
:txt
|
36
|
+
when ".csv"
|
37
|
+
:csv
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_file_path(file)
|
43
|
+
file_path = case file
|
44
|
+
when File
|
45
|
+
file.path
|
46
|
+
else
|
47
|
+
file
|
48
|
+
end
|
49
|
+
|
50
|
+
raise "Could not find '#{file_path}'" unless File.exists?(file_path)
|
51
|
+
|
52
|
+
file_path
|
53
|
+
end
|
54
|
+
|
55
|
+
def read_spreadsheet(file_path, format)
|
56
|
+
require "roo"
|
57
|
+
|
58
|
+
if format == :xls
|
59
|
+
excel = ::Roo::Excel.new(file_path)
|
60
|
+
else
|
61
|
+
excel = ::Roo::Excelx.new(file_path)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Row#to_a coerces Excel data to Strings, but we want Dates and Numbers
|
65
|
+
data = []
|
66
|
+
excel.sheet(0).each do |excel_row|
|
67
|
+
data << excel_row.inject([]) { |row, cell| row << cell; row }
|
68
|
+
end
|
69
|
+
data
|
70
|
+
end
|
71
|
+
|
72
|
+
def read_txt(file_path)
|
73
|
+
require "csv"
|
74
|
+
if RUBY_VERSION < "1.9"
|
75
|
+
::CSV.open file_path, "r", "\t"
|
76
|
+
else
|
77
|
+
CSV.read file_path, col_sep: "\t"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def read_csv(file_path)
|
82
|
+
if RUBY_VERSION < "1.9"
|
83
|
+
require "fastercsv"
|
84
|
+
FasterCSV.read file_path
|
85
|
+
else
|
86
|
+
require "csv"
|
87
|
+
CSV.read file_path
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/tabular/version.rb
CHANGED
data/tabular.gemspec
CHANGED
@@ -19,16 +19,18 @@ Gem::Specification.new do |s|
|
|
19
19
|
"LICENSE",
|
20
20
|
"README",
|
21
21
|
"Rakefile",
|
22
|
+
"lib/tabular/tables/file_reading.rb",
|
22
23
|
"lib/tabular.rb",
|
23
24
|
"lib/tabular/blank.rb",
|
24
25
|
"lib/tabular/column.rb",
|
26
|
+
"lib/tabular/column_mapper.rb",
|
25
27
|
"lib/tabular/columns.rb",
|
26
28
|
"lib/tabular/keys.rb",
|
27
29
|
"lib/tabular/renderer.rb",
|
28
30
|
"lib/tabular/row.rb",
|
29
31
|
"lib/tabular/table.rb",
|
30
|
-
"lib/tabular/zero.rb",
|
31
32
|
"lib/tabular/version.rb",
|
33
|
+
"lib/tabular/zero.rb",
|
32
34
|
"tabular.gemspec"
|
33
35
|
]
|
34
36
|
s.homepage = "http://github.com/scottwillson/tabular"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Willson
|
@@ -41,11 +41,13 @@ files:
|
|
41
41
|
- lib/tabular.rb
|
42
42
|
- lib/tabular/blank.rb
|
43
43
|
- lib/tabular/column.rb
|
44
|
+
- lib/tabular/column_mapper.rb
|
44
45
|
- lib/tabular/columns.rb
|
45
46
|
- lib/tabular/keys.rb
|
46
47
|
- lib/tabular/renderer.rb
|
47
48
|
- lib/tabular/row.rb
|
48
49
|
- lib/tabular/table.rb
|
50
|
+
- lib/tabular/tables/file_reading.rb
|
49
51
|
- lib/tabular/version.rb
|
50
52
|
- lib/tabular/zero.rb
|
51
53
|
- tabular.gemspec
|