11 个稳定版本
1.3.4 | 2020 年 3 月 1 日 |
---|---|
1.3.3 | 2019 年 11 月 21 日 |
1.3.0 | 2019 年 10 月 28 日 |
1.2.6 | 2019 年 9 月 27 日 |
1.0.2 | 2019 年 8 月 28 日 |
#1729 in 命令行工具
170KB
4.5K SLoC
Jaesve
一个纯 Rust 编写的 CLI 工具,用于将 stdin 和/或文件中的 JSON 对象流转换为一系列 CSV 值,并输出到 stdout 或文件。
安装
- 安装 rust
- 从 cargo 安装
cargoinstall jaesve
- 从仓库安装
- 运行
rustup default stable
- 运行
git clone https://github.com/bazaah/jaesve.git; cd jaesve
- 运行
cargo run --release
- 二进制文件可以在
target/release/
中找到
- 运行
- 从 cargo 安装
CLI
Jaesve 配备了 CLI,由 clap.rs 提供。您可以输入 -h
或 --help
查看可用设置,或浏览以下完整列表。
标志
-h
--help
显示帮助(使用--help
显示更详细的消息)-V
--version
显示版本信息-a
--append
追加到输出文件,而不是覆盖-q
--quiet
静音错误消息-v
调试信息的详细程度- 最大:3
选项
-o
--output
设置要写入的输出文件- 默认:
stdout
- 默认:
-l
--line
将 stdin 设置为从每行读取一个 JSON 文档,并从该行开始处理- 默认:
0
- 默认:
-E
--regex
设置正则表达式以过滤输出-c
--column
设置字段以匹配正则表达式- 可能值:
ident, jptr, type, value, jmes
- 可能值:
-f
--format
用点 '.' 分隔的字段列表,描述输出格式- 默认值:
ident.jptr.type.value
- 可能值:
ident, jptr, type, value, jmes, all
- 默认值:
-d
--delim
设置输出字段之间的分隔符- 默认值:
,
- 默认值:
-g
--guard
设置字段引用字符- 默认值:
"
- 默认值:
子命令
config
配置各种程序内嵌特性- 这些参数是不稳定的,未来可能会更改
config --help
查看当前列表
completions
自动补全脚本生成器completions[FILE] -- <SHELL>
- 如果没有指定
FILE
,则默认为标准输出 - 可能
SHELL
:bash, zsh, fish
- 如果没有指定
参数
- 一个空格分隔的有效文件路径列表,其中
-
代表 stdin。如果你想在 Arg 后添加标志和选项,你必须以-
结尾。- 例如
jaesve--quiet--append-o output.csv input1 input2-input4//这是快乐的
jaesve input1 input2-input4--quiet--append-o output.csv//这是悲伤的
jaesve input1 input2-input4: --quiet--append-o output.csv//这是快乐的
- 例如
持久参数
上述标志和选项的子集可以通过环境变量或配置文件设置。如下所示
debug
(--v
)quiet
append
line
delim
guard
format
buf_in
buf_out
linereader_eol
factor
它们期望与 CLI 变体相同的输入类型,带有标志(例如 quiet
)采用常见的布尔表示形式 - 例如 true
、No
、1
等。
当从多个来源提供变量时,程序将按以下顺序优先级排序:(从高到低)
- CLI
- 环境
- $HOME/jaesve.conf
- $CONFIG/jaesve.conf
- /etc/jaesve.conf (如果是在 *nix 上)
- 默认 (如果有)
环境
程序将检查格式为 JAESVE_<VAR_NAME>
的变量。
文件
默认情况下配置文件是禁用的,如果您想使用它们,请在您的cargo install/build
命令中添加--features=config-file
。期望的格式是TOML,下面是一个示例文件。
quiet = false
delim = ","
# Note this corresponds to the 'config' CLI subcommand
[config]
factor = "K"
性能
速度
在初步测试中,它在3分钟内解析了2G的JSON。
内存
Jaesve被编写为最小化内存使用。它使用基于流的解析JSON的方法,并尝试展开嵌套对象。其最大内存占用可以描述如下:
sizeof最大对象/数组
+sizeof组合元素NOT不包括任何对象/从文档开始到最大对象/数组
+程序开销
TLDR:嵌套越深、对象/数组越大,内存占用就越大。
示例用法
作为一个简单的示例,让我们使用以下JSON:
//sample.json
{
"aliceblue": "#f0f8ff",
"antiquewhite": "#faebd7",
"azure": "#f0ffff",
"beige": "#f5f5dc",
"black": "#000000",
"blanchedalmond": "#ffebcd",
"gradient": {
"blues": ["#0000f0", "#0000f1", "#0000f2"],
"green": "#00ff00"
}
}
运行jaesve sample.json
会打印出:
"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",""
其中
"INTEGER"
表示值来自哪个输入源"/.../..."
是该记录的json pointer"JSON TYPE"
是记录类型VALUE
是与该记录关联的值,如果它是一个端点即不是对象或数组
错误
除非设置--quiet
并使用-v
、-vv
和-vvv
进行信息提升,否则Jaesve会将任何错误打印到stderr。
它将在以下条件下出错
- JSON对象格式不正确/包含无效的Unicode点
- 无法从输入文件中读取
- 无法创建输出文件(它不会创建目录)
- 无法写入输出
错误
上述错误预计将由用户处理,如果出现其他错误,它们被认为是错误,如果您愿意,请提供一个描述错误以及您收到的错误信息的issue。
依赖项
~4.5–7MB
~117K SLoC