class MARC::AlephSequential::BufferedLineReader
AlephSequential
is a line-oriented format, with the first field of each line indicating the record number. Rather than try to screw around with keeping track of the last line read, checking to see if we have one, blah blah blah, I'm going to use a buffered line reader class so I can peek
at the next line to know if its id is different than the current record.
Attributes
buffer_size[RW]
underlying_line_number[R]
Public Class Methods
new(filename_or_io)
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 19 def initialize(filename_or_io) @passed_in = filename_or_io @underlying_line_number = 0 @buffer_size = 10 @buffer = [] if filename_or_io.is_a? String @handle = File.open(filename_or_io, 'r:utf-8') if filename_or_io =~ /\.gz$/ @handle = Zlib::GzipReader.new(@handle) end elsif filename_or_io.respond_to?("read") @handle = filename_or_io else raise ArgumentError.new("BufferedLineReader needs an IO object or filename, got #{filename_or_io} (#{filename_or_io.inspect})") end @iter = @handle.enum_for(:each_line) @finished = false # Fill up the buffer self.fillbuffer end
Public Instance Methods
each() { |next| ... }
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 78 def each begin while true yield self.next end rescue StopIteration end end
Also aliased as: each_line
fillbuffer(buffer_size = @buffer_size)
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 48 def fillbuffer(buffer_size = @buffer_size) begin buffer_size.times do raw = @iter.next @underlying_line_number += 1 @buffer.push process_raw(raw, @underlying_line_number) end rescue StopIteration @finished = true end end
has_next?()
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 44 def has_next? return !(@finished && @buffer.size == 0) end
next()
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 65 def next raise StopIteration, "End of #{@passed_in}", nil if @buffer.size == 0 rv = @buffer.shift fillbuffer if @buffer.size == 0 rv end
peek()
click to toggle source
# File lib/marc_alephsequential/buffered_linereader.rb, line 73 def peek fillbuffer unless @buffer.size > 0 @buffer[0] end
process_raw(raw, line_number)
click to toggle source
Empty version here; can override for processing lines on the fly
# File lib/marc_alephsequential/buffered_linereader.rb, line 61 def process_raw(raw, line_number) raw end