class GeoRuby::Shp4r::Dbf::Reader
Attributes
field_count[R]
fields[R]
header_length[R]
last_updated[R]
record_count[R]
record_length[R]
version[R]
Public Class Methods
new(file)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 37 def initialize(file) @data_file = File.open(file, 'rb') reload! end
open(file) { |reader| ... }
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 42 def self.open(file) reader = Reader.new(file) if block_given? yield reader reader.close else reader end end
Public Instance Methods
close()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 52 def close @data_file.close end
field(field_name)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 61 def field(field_name) @fields.detect {|f| f.name == field_name.to_s} end
record(index)
click to toggle source
Jump to record
# File lib/geo_ruby/shp4r/dbf.rb, line 80 def record(index) seek_to_record(index) active_record? ? build_record : nil end
Also aliased as: row
records()
click to toggle source
An array of all the records contained in the database file
# File lib/geo_ruby/shp4r/dbf.rb, line 66 def records seek_to_record(0) @records ||= Array.new(@record_count) do |i| if active_record? build_record else seek_to_record(i + 1) nil end end end
Also aliased as: rows
reload!()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 56 def reload! get_header_info get_field_descriptors end
version_description()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 87 def version_description VERSION_DESCRIPTIONS[version] end
Private Instance Methods
active_record?()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 93 def active_record? @data_file.read(1).unpack('H2').to_s == '20' rescue false end
build_record()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 97 def build_record record = DbfRecord.new @fields.each do |field| case field.type when 'N' record[field.name] = unpack_integer(field) rescue nil when 'F' record[field.name] = unpack_float(field) rescue nil when 'D' raw = unpack_string(field).to_s.strip unless raw.empty? begin record[field.name] = Time.gm(*raw.match(DATE_REGEXP).to_a.slice(1,3).map {|n| n.to_i}) rescue record[field.name] = Date.new(*raw.match(DATE_REGEXP).to_a.slice(1,3).map {|n| n.to_i}) rescue nil end end when 'L' record[field.name] = unpack_string(field) =~ /^(y|t)$/i ? true : false rescue false when 'C' record[field.name] = unpack_string(field).strip else record[field.name] = unpack_string(field) end end record end
get_field_descriptors()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 131 def get_field_descriptors @fields = Array.new(@field_count) {|i| Field.new(*@data_file.read(32).unpack('a10xax4CC'))} end
get_header_info()
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 125 def get_header_info @data_file.rewind @version, @record_count, @header_length, @record_length = @data_file.read(DBF_HEADER_SIZE).unpack('H2xxxVvv') @field_count = (@header_length - DBF_HEADER_SIZE + 1) / DBF_HEADER_SIZE end
seek(offset)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 135 def seek(offset) @data_file.seek(@header_length + offset) end
seek_to_record(index)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 139 def seek_to_record(index) seek(@record_length * index) end
unpack_field(field)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 143 def unpack_field(field) @data_file.read(field.length).unpack("a#{field.length}") end
unpack_float(field)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 155 def unpack_float(field) unpack_string(field).to_f end
unpack_integer(field)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 151 def unpack_integer(field) unpack_string(field).to_i end
unpack_string(field)
click to toggle source
# File lib/geo_ruby/shp4r/dbf.rb, line 147 def unpack_string(field) unpack_field(field).to_s end