22. 使い方
f = File.open("filename")
m = MmapScanner.new(f)
word = m.scan(/[a-z0-9_]+/i)
word # => MmapScanner
word.to_s # => String
23. CSVパーサー
require 'mmapscanner'
class MmapCSV
include Enumerable
def initialize(filename)
File.open(filename) do |f|
@ms = MmapScanner.new(f)
end
end
def each
rec = []
until @ms.eos?
if @ms.skip(/"((?:""|[^"])*)"(,|rn|n|z)/n)
rec.push @ms.matched_str(1).gsub(/""/,'"')
elsif @ms.skip(/([^,"rn]*)(,|rn|n|z)/n)
rec.push @ms.matched_str(1)
else
raise "invalid format: #{@ms.rest.slice(0,20).to_s}"
end
unless @ms.matched_str(2) == ','
yield rec
rec.clear
end
end
end
end