csvmapper 0.0.3 → 0.0.4
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/Changes +8 -0
- data/examples/columns.rb +16 -0
- data/examples/no_dsl.rb +24 -0
- data/examples/yp.rb +2 -0
- data/examples/yp_find.rb +35 -0
- data/lib/csvmapper.rb +64 -6
- data/lib/csvmapper/version.rb +1 -1
- metadata +5 -2
data/Changes
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
0.04
|
2
|
+
- Added #columns method
|
3
|
+
columns :first_name, :last_name, :age
|
4
|
+
- Added #grouped_by method
|
5
|
+
grouped by field key
|
6
|
+
- Added #where method
|
7
|
+
arel style finder (testing)
|
8
|
+
|
1
9
|
0.03
|
2
10
|
- Added CSVMapper#each method
|
3
11
|
- Added CSVMapper#before_filter method
|
data/examples/columns.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'csvmapper'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
class OmgCSV < CSVMapper
|
6
|
+
columns :first_name, :last_name, :age
|
7
|
+
end
|
8
|
+
|
9
|
+
csv = OmgCSV.load <<EOT
|
10
|
+
takumi,kimoto,99
|
11
|
+
super,urutoraman,11
|
12
|
+
EOT
|
13
|
+
|
14
|
+
p csv.map(&:age)
|
15
|
+
# => ["99", "11"]
|
16
|
+
|
data/examples/no_dsl.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'csvmapper'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
class MyCSV < CSVMapper
|
6
|
+
end
|
7
|
+
|
8
|
+
MyCSV.before_filter do |v|
|
9
|
+
CGI.unescapeHTML(v) if v
|
10
|
+
end
|
11
|
+
|
12
|
+
MyCSV.delimiter '<>'
|
13
|
+
MyCSV.column :name, 0, :string
|
14
|
+
MyCSV.column :hash, 1
|
15
|
+
MyCSV.column :host, 2
|
16
|
+
MyCSV.column :contact, 3, :uri
|
17
|
+
MyCSV.column :genre, 4
|
18
|
+
MyCSV.column :description, 5
|
19
|
+
MyCSV.column :active_viewers, 6, :numeric
|
20
|
+
MyCSV.column :total_viewers, 7, :numeric
|
21
|
+
|
22
|
+
csv = MyCSV.load_file("http://temp.orz.hm/yp/index.txt")
|
23
|
+
p csv
|
24
|
+
|
data/examples/yp.rb
CHANGED
data/examples/yp_find.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'csvmapper'
|
3
|
+
require 'cgi'
|
4
|
+
require 'hashie'
|
5
|
+
|
6
|
+
class YPIndex < CSVMapper
|
7
|
+
before_filter do |v|
|
8
|
+
CGI.unescapeHTML(v) if v
|
9
|
+
end
|
10
|
+
|
11
|
+
delimiter '<>'
|
12
|
+
column :name, 0, :string
|
13
|
+
column :hash, 1
|
14
|
+
column :host, 2
|
15
|
+
column :contact, 3, :uri
|
16
|
+
column :genre, 4
|
17
|
+
column :description, 5
|
18
|
+
column :active_viewers, 6, :numeric
|
19
|
+
column :total_viewers, 7, :numeric
|
20
|
+
column :bitrate, 8, :numeric
|
21
|
+
column :filetype, 9
|
22
|
+
column :artist, 10
|
23
|
+
column :title, 11
|
24
|
+
column :album, 12
|
25
|
+
column :reserved, 13
|
26
|
+
column :hash2, 14
|
27
|
+
column :time, 15
|
28
|
+
column :type, 16
|
29
|
+
column :reservee, 17
|
30
|
+
column :nullfield, 18
|
31
|
+
end
|
32
|
+
|
33
|
+
p YPIndex.load_file("http://temp.orz.hm/yp/index.txt").where(:name => 'あくえり').where(:genre => 'DQ3 SFC').first
|
34
|
+
|
35
|
+
|
data/lib/csvmapper.rb
CHANGED
@@ -9,7 +9,7 @@ require 'uri'
|
|
9
9
|
require 'open-uri'
|
10
10
|
|
11
11
|
class CSVMapper
|
12
|
-
@@
|
12
|
+
@@schema = []
|
13
13
|
@@ignore_header_line = false
|
14
14
|
@@on_error_go_to_next_line = false
|
15
15
|
@@has_header = nil
|
@@ -18,13 +18,18 @@ class CSVMapper
|
|
18
18
|
|
19
19
|
def self.column(field, *args, &block)
|
20
20
|
value = args.shift
|
21
|
-
#value = block.call(value) if block_given?
|
22
21
|
record = {
|
23
22
|
field => value,
|
24
23
|
:options => args,
|
25
24
|
:filter => block
|
26
25
|
}
|
27
|
-
@@
|
26
|
+
@@schema << record
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.columns(*fields)
|
30
|
+
fields.each_with_index{ |field, index|
|
31
|
+
self.column(field, index, :string)
|
32
|
+
}
|
28
33
|
end
|
29
34
|
|
30
35
|
def self.has_header(at=0)
|
@@ -47,6 +52,10 @@ class CSVMapper
|
|
47
52
|
|
48
53
|
records = []
|
49
54
|
buf.each_with_index{ |line, index|
|
55
|
+
if line.empty?
|
56
|
+
next
|
57
|
+
end
|
58
|
+
|
50
59
|
if @@has_header == index
|
51
60
|
line.each_with_index{ |name, i|
|
52
61
|
self.column(name.gsub(" ", "_").downcase, i, :string)
|
@@ -62,7 +71,7 @@ class CSVMapper
|
|
62
71
|
}
|
63
72
|
|
64
73
|
hash = {}
|
65
|
-
@@
|
74
|
+
@@schema.each{ |opt|
|
66
75
|
key = opt.keys.first
|
67
76
|
options = opt[:options]
|
68
77
|
|
@@ -155,17 +164,56 @@ class CSVMapper
|
|
155
164
|
@records[index]
|
156
165
|
end
|
157
166
|
|
167
|
+
## size
|
168
|
+
def rows
|
169
|
+
@records.size
|
170
|
+
end
|
171
|
+
|
172
|
+
def cols
|
173
|
+
if @records.nil? or @records.empty?
|
174
|
+
return 0
|
175
|
+
else
|
176
|
+
return @records.first.size
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
158
180
|
def [](index)
|
159
181
|
row(index)
|
160
182
|
end
|
161
183
|
|
162
184
|
include Enumerable
|
163
185
|
def each(&block)
|
164
|
-
|
165
|
-
|
186
|
+
matched = []
|
187
|
+
if @where
|
188
|
+
@records.each{ |record|
|
189
|
+
@where.each{ |key, value|
|
190
|
+
if record.send(key) == value
|
191
|
+
matched << record
|
192
|
+
end
|
193
|
+
}
|
194
|
+
}
|
195
|
+
else
|
196
|
+
matched = @records
|
197
|
+
end
|
198
|
+
|
199
|
+
matched.each{ |e|
|
200
|
+
block.call(e)
|
166
201
|
}
|
167
202
|
end
|
168
203
|
|
204
|
+
## arel style finder
|
205
|
+
def where(options={})
|
206
|
+
@where = Hashie::Clash.new(options) if @where.nil?
|
207
|
+
@where.merge! options
|
208
|
+
self
|
209
|
+
end
|
210
|
+
|
211
|
+
def order(options={})
|
212
|
+
@order = Hashie::Clash.new(options) if @order.nil?
|
213
|
+
@order.merge! options
|
214
|
+
self
|
215
|
+
end
|
216
|
+
|
169
217
|
def to_hash
|
170
218
|
@records.map{ |record|
|
171
219
|
record.to_hash
|
@@ -175,5 +223,15 @@ class CSVMapper
|
|
175
223
|
def to_json
|
176
224
|
@records.to_json
|
177
225
|
end
|
226
|
+
|
227
|
+
def grouped_by(field)
|
228
|
+
hash = {}
|
229
|
+
each{|e|
|
230
|
+
k = e[field]
|
231
|
+
hash[k] ||= []
|
232
|
+
hash[k] << e
|
233
|
+
}
|
234
|
+
hash
|
235
|
+
end
|
178
236
|
end
|
179
237
|
|
data/lib/csvmapper/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: csvmapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08-
|
12
|
+
date: 2012-08-03 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: CSV to Ruby class mapper
|
15
15
|
email:
|
@@ -27,7 +27,10 @@ files:
|
|
27
27
|
- csvmapper.gemspec
|
28
28
|
- examples/basic.rb
|
29
29
|
- examples/basic2.rb
|
30
|
+
- examples/columns.rb
|
31
|
+
- examples/no_dsl.rb
|
30
32
|
- examples/yp.rb
|
33
|
+
- examples/yp_find.rb
|
31
34
|
- lib/csvmapper.rb
|
32
35
|
- lib/csvmapper/version.rb
|
33
36
|
homepage: ''
|