@@ -133,34 +133,75 @@ def initialize_copy(other)
133
133
super_return_value
134
134
end
135
135
136
- # Returns +true+ if this is a header row.
136
+ # :call-seq:
137
+ # row.header_row? -> true or false
138
+ #
139
+ # Returns +true+ if this is a header row, +false+ otherwise.
137
140
def header_row?
138
141
@header_row
139
142
end
140
143
141
- # Returns +true+ if this is a field row.
144
+ # :call-seq:
145
+ # row.field_row? -> true or false
146
+ #
147
+ # Returns +true+ if this is a field row, +false+ otherwise.
142
148
def field_row?
143
149
not header_row?
144
150
end
145
151
146
- # Returns the headers of this row.
152
+ # :call-seq:
153
+ # row.headers
154
+ #
155
+ # Returns the headers for this row:
156
+ # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
157
+ # table = CSV.parse(source, headers: true)
158
+ # row = table.first
159
+ # row.headers # => ["Name", "Value"]
147
160
def headers
148
161
@row . map ( &:first )
149
162
end
150
163
151
- #
152
164
# :call-seq:
153
- # field( header )
154
- # field( header, offset )
155
- # field( index )
156
- #
157
- # This method will return the field value by +header+ or +index+. If a field
158
- # is not found, +nil+ is returned.
159
- #
160
- # When provided, +offset+ ensures that a header match occurs on or later
161
- # than the +offset+ index. You can use this to find duplicate headers,
162
- # without resorting to hard-coding exact indices.
163
- #
165
+ # field(index)
166
+ # field(header)
167
+ # field(header, offset)
168
+ #
169
+ # Returns the field value for the given +index+ or +header+.
170
+ # If an \Integer +offset+ is given, the first +offset+ columns are
171
+ # ignored.
172
+ #
173
+ # ---
174
+ #
175
+ # Fetch field value by \Integer index:
176
+ # source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
177
+ # table = CSV.parse(source, headers: true)
178
+ # row = table[0]
179
+ # row.field(0) # => "foo"
180
+ # row.field(1) # => "bar"
181
+ #
182
+ # Counts backward from the last column if +index+ is negative:
183
+ # row.field(-1) # => "0"
184
+ # row.field(-2) # => "foo"
185
+ #
186
+ # Returns +nil+ if +index+ is out of range:
187
+ # row.field(2) # => nil
188
+ # row.field(-3) # => nil
189
+ #
190
+ # ---
191
+ #
192
+ # Fetch field value by header (first found):
193
+ # source = "Name,Name,Name\nFoo,Bar,Baz\n"
194
+ # table = CSV.parse(source, headers: true)
195
+ # row = table[0]
196
+ # row.field('Name') # => "Foo"
197
+ #
198
+ # Fetch field value by header, ignoring +offset+ leading fields:
199
+ # source = "Name,Name,Name\nFoo,Bar,Baz\n"
200
+ # table = CSV.parse(source, headers: true)
201
+ # row = table[0]
202
+ # row.field('Name', 2) # => "Baz"
203
+ #
204
+ # Returns +nil+ if the header does not exist.
164
205
def field ( header_or_index , minimum_index = 0 )
165
206
# locate the pair
166
207
finder = ( header_or_index . is_a? ( Integer ) || header_or_index . is_a? ( Range ) ) ? :[] : :assoc
@@ -177,16 +218,45 @@ def field(header_or_index, minimum_index = 0)
177
218
178
219
#
179
220
# :call-seq:
180
- # fetch( header )
181
- # fetch( header ) { |row| ... }
182
- # fetch( header, default )
183
- #
184
- # This method will fetch the field value by +header+. It has the same
185
- # behavior as Hash#fetch: if there is a field with the given +header+, its
186
- # value is returned. Otherwise, if a block is given, it is yielded the
187
- # +header+ and its result is returned; if a +default+ is given as the
188
- # second argument, it is returned; otherwise a KeyError is raised.
189
- #
221
+ # fetch(header)
222
+ # fetch(header, default)
223
+ # fetch(header) {|row| ... }
224
+ #
225
+ # Returns the field value as specified by +header+.
226
+ #
227
+ # ---
228
+ #
229
+ # With the single argument +header+, returns the field value
230
+ # for that header (first found):
231
+ # source = "Name,Name,Name\nFoo,Bar,Baz\n"
232
+ # table = CSV.parse(source, headers: true)
233
+ # row = table[0]
234
+ # row.fetch('Name') # => "Foo"
235
+ #
236
+ # Raises exception +KeyError+ if the header does not exist.
237
+ #
238
+ # ---
239
+ #
240
+ # With arguments +header+ and +default+ given,
241
+ # returns the field value for the header (first found)
242
+ # if the header exists, otherwise returns +default+:
243
+ # source = "Name,Name,Name\nFoo,Bar,Baz\n"
244
+ # table = CSV.parse(source, headers: true)
245
+ # row = table[0]
246
+ # row.fetch('Name', '') # => "Foo"
247
+ # row.fetch(:nosuch, '') # => ""
248
+ #
249
+ # ---
250
+ #
251
+ # With argument +header+ and a block given,
252
+ # returns the field value for the header (first found)
253
+ # if the header exists; otherwise calls the block
254
+ # and returns its return value:
255
+ # source = "Name,Name,Name\nFoo,Bar,Baz\n"
256
+ # table = CSV.parse(source, headers: true)
257
+ # row = table[0]
258
+ # row.fetch('Name') {|header| fail 'Cannot happen' } # => "Foo"
259
+ # row.fetch(:nosuch) {|header| "Header '#{header} not found'" } # => "Header 'nosuch not found'"
190
260
def fetch ( header , *varargs )
191
261
raise ArgumentError , "Too many arguments" if varargs . length > 1
192
262
pair = @row . assoc ( header )
@@ -203,7 +273,11 @@ def fetch(header, *varargs)
203
273
end
204
274
end
205
275
206
- # Returns +true+ if there is a field with the given +header+.
276
+ # :call-seq:
277
+ # row.has_key?(header)
278
+ #
279
+ # Returns +true+ if there is a field with the given +header+,
280
+ # +false+ otherwise.
207
281
def has_key? ( header )
208
282
!!@row . assoc ( header )
209
283
end
0 commit comments