class Framecurve::Parser
Parses the data in the passed file/IO into a Curve object.
curve = Framecurve::Parser.new.parse("/tmp/curve.framecurve.txt")
Constants
- COMMENT
- CORRELATION_RECORD
Public Instance Methods
parse(path_or_io)
click to toggle source
Parse from file path or IO. If the passed object is an IO it will be read from. If the passed object is a string it will be interpreted as a path and the file at that path will be parsed instead
# File lib/framecurve/parser.rb, line 10 def parse(path_or_io) # If the first argument is a path parse from the opened file, # and record the filename in the curve as well unless path_or_io.respond_to?(:read) return File.open(path_or_io, "r", &method(:parse)) end @line_counter = 0 # IO#lineno is not exactly super-reliable elements = [] until path_or_io.eof? str = path_or_io.gets("\n") @line_counter += 1 str = str.strip item = if str =~ COMMENT extract_comment(str) elsif str =~ CORRELATION_RECORD extract_tuple(str) else raise Framecurve::Malformed, "Malformed line #{str.inspect} at offset #{path_or_io.pos}, line #{@line_counter}" end elements.push(item) end curve = Framecurve::Curve.new(elements) # Pick the actual filename if it's available if path_or_io.respond_to?(:path) && path_or_io.path curve.filename = File.basename(path_or_io.path) end return curve end
Private Instance Methods
extract_comment(line)
click to toggle source
# File lib/framecurve/parser.rb, line 44 def extract_comment(line) comment_txt = line.scan(COMMENT).flatten[0].strip Framecurve::Comment.new(comment_txt) end
extract_tuple(line)
click to toggle source
# File lib/framecurve/parser.rb, line 49 def extract_tuple(line) slots = line.scan(CORRELATION_RECORD).flatten Framecurve::Tuple.new(slots[0].to_i, slots[1].to_f) end