fasterer-csv 0.0.4 → 0.0.5

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.
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