Parser Example: ContinuousIntegerParser
The ContinuousIntegerParser
example is a variation of BasicIntegerParser
. Both examples parse integers from input strings. ContinuousIntegerParser
uses Continuous Load to read data.
Loading and Using the Example
Load the ContinuousIntegerParser
example as follows.
=> CREATE LIBRARY ContinuousIntegerParserLib AS '/home/dbadmin/CIP.so'; => CREATE PARSER ContinuousIntegerParser AS LANGUAGE 'C++' NAME 'ContinuousIntegerParserFactory' LIBRARY ContinuousIntegerParserLib;
Use it in the same way that you use BasicIntegerParser
. See Parser Example: BasicIntegerParser.
Implementation
ContinuousIntegerParser
is a subclass of ContinuousUDParser
. Subclasses of ContinuousUDParser
place the processing logic in the run()
method.
virtual void run() { // This parser assumes a single-column input, and // a stream of ASCII integers split by non-numeric characters. size_t pos = 0; size_t reserved = cr.reserve(pos+1); while (!cr.isEof() || reserved == pos + 1) { while (reserved == pos + 1 && isdigit(*ptr(pos))) { pos++; reserved = cr.reserve(pos + 1); } std::string st(ptr(), pos); writer->setInt(0, strToInt(st)); writer->next(); while (reserved == pos + 1 && !isdigit(*ptr(pos))) { pos++; reserved = cr.reserve(pos + 1); } cr.seek(pos); pos = 0; reserved = cr.reserve(pos + 1); } } };
For a more complex example of a ContinuousUDParser
, see ExampleDelimitedParser
in the examples. (See Downloading and Running UDx Example Code.) ExampleDelimitedParser
uses a chunker; see Chunker Example: Delimited Parser and Chunker.