Crates.io | jaesve |
lib.rs | jaesve |
version | 1.3.4 |
source | src |
created_at | 2019-08-26 17:42:15.8011 |
updated_at | 2020-03-01 22:09:02.967827 |
description | A CLI utility for stream converting JSON objects to a series of CSV values |
homepage | https://github.com/bazaah/jaesve |
repository | https://github.com/bazaah/jaesve |
max_upload_size | |
id | 159835 |
size | 204,995 |
A CLI utility written in pure Rust for stream converting JSON objects to a series of CSV values, from stdin and/or file(s) to stdout or a file.
cargo install jaesve
rustup default stable
git clone https://github.com/bazaah/jaesve.git; cd jaesve
cargo run --release
target/release/
Jaesve comes with a CLI, courtesy of clap.rs. You can type -h
or --help
to see the available settings, or browse a complete listing below.
-h
--help
Displays help (use --help
for more detailed messages)-V
--version
Displays version information-a
--append
Append to output file, instead of overwriting-q
--quiet
Silences error messages-v
Verbosity of debug information
-o
--output
Set output file to write
stdout
-l
--line
Set stdin to read a JSON doc from each line, and the line to start processing from
0
-E
--regex
Set a regex to filter output-c
--column
Sets field to match regex on
ident, jptr, type, value, jmes
-f
--format
A dot '.' separated list of fields describing how output is formatted
ident.jptr.type.value
ident, jptr, type, value, jmes, all
-d
--delim
Sets delimiter between output fields
,
-g
--guard
Set field quote character
"
config
Configure various program intrinsics
config --help
for the current listcompletions
Autocompletion script generator
completions [FILE] -- <SHELL>
FILE
is present, defaults to stdoutSHELL
s: bash, zsh, fish
-
representing stdin. If you wish to add flags and options after this Arg, you must end its values with a :
.
jaesve --quiet --append -o output.csv input1 input2 - input4 // This is happy
jaesve input1 input2 - input4 --quiet --append -o output.csv // This is sad
jaesve input1 input2 - input4 : --quiet --append -o output.csv // This is happy
A subset of the above flags and options can be set via environment variables or config file(s). Listed below:
debug
(-v
)quiet
append
line
delim
guard
format
buf_in
buf_out
linereader_eol
factor
They expect the same input kinds as the CLI variants, with flags (i.e quiet
) taking common bool representations -- e.g true
, No
, 1
, etc.
When given a variable from multiple sources the program will prioritize in this order: (highest to lowest)
The program will check for variables with the format JAESVE_<VAR_NAME>
.
Config files are disabled by default, if you wish to use them add --features=config-file
to your cargo install/build
. The expect format is TOML and an example file is listed below:
quiet = false
delim = ","
# Note this corresponds to the 'config' CLI subcommand
[config]
factor = "K"
In preliminary tests it parsed 2G of JSON in 3 minutes.
Jaesve is written to minimize memory usage. It uses a stream based approach to parsing JSON, and attempts to unroll nested objects. Its maximum memory footprint can be described as follows:
sizeof largest object/array
+sizeof combined elements NOT including any object/array from doc start to largest object/array
+program overhead
TLDR: the more deeply nested and larger the objects/arrays, the larger the memory footprint.
For a simple example, let's use the following JSON:
//sample.json
{
"aliceblue": "#f0f8ff",
"antiquewhite": "#faebd7",
"azure": "#f0ffff",
"beige": "#f5f5dc",
"black": "#000000",
"blanchedalmond": "#ffebcd",
"gradient": {
"blues": ["#0000f0", "#0000f1", "#0000f2"],
"green": "#00ff00"
}
}
Running jaesve sample.json
prints out
"1","/gradient/blues/0","String","#0000f0"
"1","/gradient/blues/1","String","#0000f1"
"1","/gradient/blues/2","String","#0000f2"
"1","/gradient/green","String","#00ff00"
"1","/gradient/blues","Array",""
"1","/aliceblue","String","#f0f8ff"
"1","/antiquewhite","String","#faebd7"
"1","/azure","String","#f0ffff"
"1","/beige","String","#f5f5dc"
"1","/black","String","#000000"
"1","/blanchedalmond","String","#ffebcd"
"1","/gradient","Object",""
Where:
"INTEGER"
is which input source the value came from"/.../..."
is the json pointer of that record"JSON TYPE"
is the record typeVALUE
is the value associated with that record, if it is an endpoint i.e not a Object or ArrayJaesve prints any errors to stderr unless --quiet
is set with escalating information on -v
, -vv
and -vvv
.
It will error for the following conditions:
The above errors are expected to be handled by the user, if other errors occur they are considered bugs and I'd appreciate it if you'd open an issue with a description of what went wrong and the error message you received.