Rust轻量级数据处理库du-dust的使用,高效处理未定义数据结构的解析与转换

Rust轻量级数据处理库du-dust的使用,高效处理未定义数据结构的解析与转换

简介

Dust是一个用Rust编写的磁盘使用分析工具,结合了du命令的功能和Rust的高效性能。它可以直观地显示磁盘空间使用情况,无需手动使用sort或head命令。

Example

安装方式

Cargo安装

cargo install du-dust

其他安装方式

  • Mac OS: brew install dust
  • Linux: brew install dust
  • Ubuntu: snap install dust
  • Windows: scoop install dust

主要功能

Dust会自动显示终端高度范围内的最大子目录或文件,并智能地递归查找较大的目录。主要特点包括:

  1. 无需使用-d-h标志
  2. 最大子目录会用彩色显示
  3. 条形的不同颜色代表组合的树层次结构和磁盘使用情况

使用示例

// 基本使用
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();
}

替代方案

  1. NCDU
  2. dutree
  3. dua
  4. pdu
  5. dirstat-rs
  6. 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库的主要功能:

  1. 数据解析:从JSON字符串解析为du-dust的Value类型
  2. 数据操作:修改值、添加新字段、访问嵌套字段
  3. 自定义转换:使用TimestampConverter转换时间戳格式
  4. 数据验证:使用UserValidator验证数据完整性
  5. 类型转换:将Value转换为Rust标准HashMap
  6. 数组处理:过滤、映射和计算数组数据

性能提示

  1. 对于大型JSON文件,使用du_dust::from_reader替代from_str以减少内存占用
  2. 批量操作时优先使用迭代器方法
  3. 对已知结构的部分数据可转换为具体Rust类型提高性能

总结

du-dust提供了灵活处理动态数据结构的能力,特别适合处理模式不固定或需要动态转换的数据场景。通过这个完整示例,您可以快速掌握该库的核心用法。

回到顶部