RecordParser¶
Usage
use RecordParser;
Read records using regular expressions.
A general purpose record reader/parser for channels. Uses a regular expression to capture portions of the input, and then assigns each capture to each record field.
This module makes the following assumptions:
- The file has been opened for reading and a reader channel has been created
- The programmer has created a record (NOT a class) in which all fields can be cast from strings (i.e no subrecords, arrays etc).
- The number of captures in the regex string provided MUST match the number of fields in the record.
- The order in which the fields in the record appear must be in the same order as the record being parsed.
Example 1¶
use RecordParser;
record Bar {
var beer: string;
var Name: string;
}
var f = open("input1.txt", iomode.rw);
var fr = f.reader();
var M = new RecordReader(Bar, fr);
var c = M.get();
writeln("The first record read is ", c);
writeln("The rest of the records are:");
for r in M.stream() do
writeln(r);
Example 2¶
use RecordParser;
record Beer {
var name: string;
var beerId: int;
var brewerId: int;
var ABV: real;
var style: string;
var appearance: real;
var aroma: real;
var palate: real;
var taste: real;
var overall: real;
var time: int;
var profileName: string;
var text: string;
}
var strt = "\\s*beer/name: (.*)\\s*beer/beerId: (.*)\\s*beer/brewerId: (.*)\\s*beer/ABV: (.*)\\s*beer/style: (.*)\\s*review/appearance: (.*)\\s*review/aroma: (.*)\\s*review/palate: (.*)\\s*review/taste: (.*)\\s*review/overall: (.*)\\s*review/time: (.*)\\s*review/profileName: (.*)\\s*review/text: (.*)";
var N = new RecordReader(Beer, ffr, strt);
writeln("========== test of stream() ==============");
for r in N.stream() do
writeln(r);
RecordParser Types and Functions¶
-
class
RecordReader
¶ A class providing the ability to read records matching a regular expression.
-
type
t
¶ The record type to populate
-
var
myReader
¶ The channel to read from
-
var
matchRegexp
: regexp¶ The regular expression to read (using match on the channel)
-
proc
init
(type t, myReader)¶ Create a RecordReader to match an auto-generated regular expression for a record created by the
createRegexp
routine.Arguments: - t -- the record type to read
- myReader -- the channel to read from
-
proc
init
(type t, myReader, mRegexp) Create a RecordReader to read using a passed regular expression.
Arguments: - t -- the record type to read
- myReader -- the channel to read from
- mRegexp -- the regular expression to read. This argument currently must be a string, but in the future might be a compiled regular expression.
-
proc
createRegexp
()¶ Create a string regular expression for the record type
t
attached to this RecordReader.The created regular expression will search for
<fieldName1> <spaces> <fieldValue1> <spaces>
-
iter
stream_num
(offst: int(64), len: int(64))¶ Yield records for the range offst..offst+len, but assumes that the channel is already at offst.
Arguments: - offst -- the current position of the channel
- len -- the number of bytes to read
-
proc
get
() throws¶ Read the next record
-
iter
stream
()¶ Yield the records read
-
type