txt2data

Turn any text into structured data using Earley (ixml) grammars.

Example:
CLI Usage

Install

cargo install txt2data

Or build from source:

git clone https://github.com/rh-jfuller/txt2data && cd txt2data
make release && make install

Quick start

# inline grammar, stdin input
printf 'alice,30' | txt2data -e 'row: name, -",", age. name: ["a"-"z"]+. age: ["0"-"9"]+.'

# grammar file, input file
txt2data -g format.ixml -i data.txt

# choose output format
txt2data -g format.ixml -i data.txt -f xml

Options

FlagDescription
-g, --grammar <FILE>Grammar file
-e, --expr <GRAMMAR>Inline grammar
-i, --input <FILE>Input file (default: stdin)
-f, --format <FORMAT>json (default), xml, yaml, sql
-h, --helpShow help
-V, --versionShow version

Environment variables

VariableDefaultDescription
TXT2DATA_MAX_GRAMMAR1048576 (1 MB)Max grammar size in bytes
TXT2DATA_MAX_INPUT10485760 (10 MB)Max input size in bytes

Grammar syntax

Rules are name: definition. -- a name, colon, body, period.

SyntaxMeaning
"text"Literal
["a"-"z"]Character range
["abc"]Character set
[Ll]Unicode category
~[" "]Exclusion (anything except)
a, bSequence
a; bAlternative
x+One or more
x*Zero or more
x?Optional
-xHidden (match but omit)
@xAttribute (flat string)
+"text"Insertion (output only)
#0AHex codepoint

Marks

Marks control output shape:

MarkEffect
(none)Nested object (JSON) or element (XML)
-Matched but hidden; children promoted up
@Flat string property / XML attribute
^Explicitly an element
Rust Library Usage

Add dependency

cargo add txt2data

Parse to JSON

use txt2data::parse_to_json;

let grammar = r#"
    row: name, -",", age.
    name: ["a"-"z"]+.
    age:  ["0"-"9"]+.
"#;

let json = parse_to_json(grammar, "alice,30").unwrap();
// {"name":{"#text":"alice"},"age":{"#text":"30"}}

Other formats

use txt2data::{parse_to_xml, parse_to_yaml, parse_to_sql};

let xml  = parse_to_xml(grammar, input).unwrap();
let yaml = parse_to_yaml(grammar, input).unwrap();
let sql  = parse_to_sql(grammar, input).unwrap();

Lower-level API

use txt2data::{parse_grammar, Parser, to_json};

let grammar = parse_grammar(src).unwrap();
let parser = Parser::new(&grammar);
let tree = parser.parse(input).unwrap();
let json = to_json(&tree);

Environment variables

VariableDefaultDescription
TXT2DATA_MAX_GRAMMAR1048576 (1 MB)Max grammar size in bytes
TXT2DATA_MAX_INPUT10485760 (10 MB)Max input size in bytes