Turn any text into structured data using Earley (ixml) grammars.
cargo install txt2data
Or build from source:
git clone https://github.com/rh-jfuller/txt2data && cd txt2data
make release && make install
# 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
| Flag | Description |
|---|---|
-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, --help | Show help |
-V, --version | Show version |
| Variable | Default | Description |
|---|---|---|
TXT2DATA_MAX_GRAMMAR | 1048576 (1 MB) | Max grammar size in bytes |
TXT2DATA_MAX_INPUT | 10485760 (10 MB) | Max input size in bytes |
Rules are name: definition. -- a name, colon, body, period.
| Syntax | Meaning |
|---|---|
"text" | Literal |
["a"-"z"] | Character range |
["abc"] | Character set |
[Ll] | Unicode category |
~[" "] | Exclusion (anything except) |
a, b | Sequence |
a; b | Alternative |
x+ | One or more |
x* | Zero or more |
x? | Optional |
-x | Hidden (match but omit) |
@x | Attribute (flat string) |
+"text" | Insertion (output only) |
#0A | Hex codepoint |
Marks control output shape:
| Mark | Effect |
|---|---|
| (none) | Nested object (JSON) or element (XML) |
- | Matched but hidden; children promoted up |
@ | Flat string property / XML attribute |
^ | Explicitly an element |
cargo add txt2data
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"}}
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();
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);
| Variable | Default | Description |
|---|---|---|
TXT2DATA_MAX_GRAMMAR | 1048576 (1 MB) | Max grammar size in bytes |
TXT2DATA_MAX_INPUT | 10485760 (10 MB) | Max input size in bytes |