fasterer-csv 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/fasterer_csv.rb +68 -4
  2. metadata +5 -5
@@ -15,11 +15,11 @@ module FastererCSV
15
15
 
16
16
  attr_reader :headers, :lines
17
17
 
18
-
19
18
  def initialize(headers, fail_on_malformed_columns = true)
20
19
  @headers = Table.format_headers(headers)
21
20
  @fail_on_malformed_columns = fail_on_malformed_columns
22
21
  @lines = 0
22
+ @indexes = {}
23
23
  end
24
24
 
25
25
  def <<(row)
@@ -42,6 +42,64 @@ module FastererCSV
42
42
  super(row)
43
43
  end
44
44
 
45
+ def merge(*tables)
46
+
47
+ tables.each do |table|
48
+ matching = self.headers & table.headers
49
+
50
+ key = {}
51
+
52
+ table.each do |row|
53
+ matching.each do |match|
54
+ key[match] = row[match]
55
+ end
56
+
57
+ self.lookup(key) { |r| r.merge(row) }
58
+ end
59
+ end
60
+
61
+ self
62
+
63
+ end
64
+
65
+ def index(columns, reindex = false)
66
+ columns = columns.compact.uniq.sort{ |a, b| a.to_s <=> b.to_s }.map { |column| Row.to_key(column) }
67
+
68
+ key = columns.join('|#|')
69
+
70
+ @indexes[key] ||= {}
71
+
72
+ index = @indexes[key]
73
+
74
+ if reindex || index.empty?
75
+
76
+ self.each do |row|
77
+ vkey = columns.map { |column| row[column] }
78
+ index[vkey] ||= []
79
+ index[vkey] << row
80
+ end
81
+ end
82
+ index
83
+ end
84
+
85
+ def lookup(key)
86
+
87
+ values = []
88
+ columns = key.keys.compact.uniq.sort{ |a, b| a.to_s <=> b.to_s }.map do |column|
89
+ values << key[column]
90
+ Row.to_key(column)
91
+ end
92
+
93
+ rows = index(columns)[values]
94
+ if rows && block_given?
95
+ rows.each do |row|
96
+ yield(row)
97
+ end
98
+ end
99
+
100
+ rows
101
+ end
102
+
45
103
  end
46
104
 
47
105
  class Row < Array
@@ -95,9 +153,15 @@ module FastererCSV
95
153
  end
96
154
  end
97
155
 
98
- def merge(hsh)
99
- hsh.each do |key, value|
100
- self[key] = value
156
+ def merge(row)
157
+ if row.class == Row
158
+ row.headers.each do |header|
159
+ self[header] = row[header]
160
+ end
161
+ else
162
+ row.each do |key, value|
163
+ self[key] = value
164
+ end
101
165
  end
102
166
  self
103
167
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fasterer-csv
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 4
10
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mason
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-05-03 00:00:00 -07:00
18
+ date: 2010-06-01 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -63,6 +63,6 @@ rubyforge_project:
63
63
  rubygems_version: 1.3.7
64
64
  signing_key:
65
65
  specification_version: 3
66
- summary: A faster implementation fo a CSV parser than FasterCSV
66
+ summary: Even fasterer than FasterCSV!
67
67
  test_files: []
68
68