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
row(index)
Alias for: record
rows()
Alias for: records
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