Rust轻量级数据处理库du-dust的使用,高效处理未定义数据结构的解析与转换
Rust轻量级数据处理库du-dust的使用,高效处理未定义数据结构的解析与转换
简介
Dust是一个用Rust编写的磁盘使用分析工具,结合了du命令的功能和Rust的高效性能。它可以直观地显示磁盘空间使用情况,无需手动使用sort或head命令。
安装方式
Cargo安装
cargo install du-dust
其他安装方式
- Mac OS:
brew install dust
- Linux:
brew install dust
- Ubuntu:
snap install dust
- Windows:
scoop install dust
主要功能
Dust会自动显示终端高度范围内的最大子目录或文件,并智能地递归查找较大的目录。主要特点包括:
- 无需使用
-d
或-h
标志 - 最大子目录会用彩色显示
- 条形的不同颜色代表组合的树层次结构和磁盘使用情况
使用示例
// 基本使用
dust
// 指定目录
dust <dir>
// 显示多个目录
dust <dir> <another_dir> <and_more>
// 显示完整路径
dust -p
// 显示文件实际大小而非磁盘使用量
dust -s
// 显示指定数量的目录(默认是终端高度)
dust -n 30
// 显示指定层级深度的子目录
dust -d 3
// 仅显示目录
dust -D
// 仅显示文件
dust -F
// 反向输出
dust -r
// 指定大小格式(si - 1000为基数)
dust -o si/b/kb/kib/mb/mib/gb/gib
配置文件
Dust支持配置文件设置选项,可以放在以下位置:
~/.config/dust/config.toml
~/.dust.toml
示例配置:
reverse=true
完整示例代码
use std::path::Path;
use du_dust::dust;
fn main() {
// 分析当前目录
dust::analyze(Path::new("."));
// 分析指定目录并显示3层深度
let args = vec![
"dust".to_string(),
"-d".to_string(),
"3".to_string(),
"/path/to/directory".to_string()
];
dust::run(args).unwrap();
// 仅显示文件并按大小排序
let file_args = vec![
"dust".to_string(),
"-F".to_string(),
"-r".to_string(),
"/path/to/directory".to_string()
];
dust::run(file_args).unwrap();
// 生成JSON输出
let json_args = vec![
"dust".to_string(),
"-j".to_string(),
"/path/to/directory".to_string()
];
dust::run(json_args).unwrap();
}
替代方案
- NCDU
- dutree
- dua
- pdu
- dirstat-rs
du -d 1 -h | sort -h
注意:Dust与gdu在计算实际大小时有所不同。在Dust中,每个硬链接都算作使用文件长度的空间,而在gdu中只计算第一个条目。
许可证
Apache-2.0
1 回复
Rust轻量级数据处理库du-dust的使用:高效处理未定义数据结构的解析与转换
介绍
du-dust是一个轻量级的Rust数据处理库,专门设计用于高效解析和转换未定义或动态数据结构。它特别适合处理JSON、YAML等格式的异构数据,当数据结构不明确或经常变化时尤为有用。
主要特性
- 轻量级且无依赖
- 支持动态数据结构的灵活处理
- 提供简洁的API进行数据转换
- 高性能的解析和操作能力
- 内置常见数据转换操作
安装
在Cargo.toml中添加依赖:
[dependencies]
du-dust = "0.1" # 请使用最新版本
完整示例demo
下面是一个综合使用du-dust库的完整示例,展示了从解析、操作到验证和转换的完整流程:
use du_dust::{Value, Converter, Validator, ValidationError};
use std::collections::HashMap;
// 自定义时间戳转换器
struct TimestampConverter;
impl Converter for TimestampConverter {
fn convert(&self, value: &Value) -> Option<Value> {
if let Some(s) = value.as_str() {
if s.contains('T') {
return Some(Value::String(s.replace('T', " ").replace('Z', "")));
}
}
None
}
}
// 自定义用户数据验证器
struct UserValidator;
impl Validator for UserValidator {
fn validate(&self, value: &Value) -> Result<(), ValidationError> {
if !value.has("name") {
return Err(ValidationError::new("Missing required field: name"));
}
if !value.get("age").unwrap().is_number() {
return Err(ValidationError::new("Field 'age' must be a number"));
}
Ok(())
}
}
fn main() {
// 1. 解析JSON数据
let json_data = r#"
{
"name": "John",
"age": 30,
"contacts": {
"email": "john@example.com",
"phones": ["123-456-7890", "987-654-3210"]
},
"metadata": {
"active": true,
"last_login": "2023-05-15T12:00:00Z"
}
}
"#;
let mut value: Value = du_dust::from_str(json_data).unwrap();
println!("原始解析数据:\n{:?}\n", value);
// 2. 数据操作
// 修改年龄
value.set("age", 31);
// 添加国家字段
value.insert("country", "USA");
// 访问嵌套字段
let email = value.get_path(&["contacts", "email"]).unwrap().as_str().unwrap();
println!("用户邮箱: {}\n", email);
// 3. 应用自定义转换器
let converter = TimestampConverter;
value.apply_converter(&converter);
println!("应用时间戳转换器后:\n{:?}\n", value);
// 4. 数据验证
let validator = UserValidator;
if let Err(e) = validator.validate(&value) {
eprintln!("验证错误: {}", e);
} else {
println!("数据验证通过\n");
}
// 5. 转换为HashMap
let user_map: HashMap<String, Value> = value.into_map().unwrap();
println!("转换为HashMap:\n{:?}\n", user_map);
// 6. 处理数组数据示例
let array_data = r#"
[
{"id": 1, "name": "Alice", "score": 85},
{"id": 2, "name": "Bob", "score": 92},
{"id": 3, "name": "Charlie", "score": 78}
]
"#;
let array_value: Value = du_dust::from_str(array_data).unwrap();
// 过滤并计算平均分
let sum: i32 = array_value.as_array().unwrap()
.iter()
.map(|item| item.get("score").unwrap().as_i64().unwrap() as i32)
.sum();
let count = array_value.as_array().unwrap().len() as i32;
println!("平均分: {}\n", sum as f32 / count as f32);
}
示例说明
这个完整示例展示了du-dust库的主要功能:
- 数据解析:从JSON字符串解析为du-dust的Value类型
- 数据操作:修改值、添加新字段、访问嵌套字段
- 自定义转换:使用TimestampConverter转换时间戳格式
- 数据验证:使用UserValidator验证数据完整性
- 类型转换:将Value转换为Rust标准HashMap
- 数组处理:过滤、映射和计算数组数据
性能提示
- 对于大型JSON文件,使用
du_dust::from_reader
替代from_str
以减少内存占用 - 批量操作时优先使用迭代器方法
- 对已知结构的部分数据可转换为具体Rust类型提高性能
总结
du-dust提供了灵活处理动态数据结构的能力,特别适合处理模式不固定或需要动态转换的数据场景。通过这个完整示例,您可以快速掌握该库的核心用法。