#cleanup #data-processing #csv

nightly macro no-std sanitise

无烦恼的数据清理

8 个不稳定版本 (3 个重大变更)

0.4.0 2023年5月21日
0.3.0 2023年5月20日
0.2.1 2023年5月19日
0.1.3 2023年5月17日

#2716解析器实现

Download history 3/week @ 2024-04-02

83 每月下载量

MIT/Apache

74KB
1.5K SLoC

sanitise

一个用于无烦恼数据清理和验证的库。

crates.io github docs.rs

sanitise 是一个 CSV 处理和验证库,它基于 YAML 配置文件在编译时生成代码。生成的代码是健壮的,不会崩溃。

no_std 环境受支持,但需要 alloc 包。

快速入门

sanitise 添加到你的 Cargo.toml 依赖项中

[dependencies]
sanitise = "0.1"

导入宏

use sanitise::sanitise_string;

然后调用

// main.rs
use std::{fs, iter::zip};

use sanitise::sanitise_string;

fn main() {
    let csv = fs::read_to_string("data.csv").unwrap();
    let ((time_millis, pulse, movement), (time_secs,)) = sanitise_string!(include_str!("sanitise_config.yaml"), &csv).unwrap();

    println!("time_millis,time_secs,pulse,movement");
    for (((time_millis, pulse), movement), time_secs) in zip(zip(zip(time_millis, pulse), movement), time_secs) {
        println!("{time_millis},{time_secs},{pulse},{movement}")
    }
}
# sanitise_config.yaml
processes:
  - name: validate
    columns:
      - title: time
        type: integer
      - title: pulse
        type: integer
        max: 100
        min: 40
        on-invalid: average
        valid-streak: 3
      - title: movement
        type: integer
        valid-values: [0, 1]
        output-type: boolean
        output: "value == 1"
  - name: process
    columns:
      - title: time
        type: integer
        output: "value / 1000"
      - title: pulse
        type: integer
        ignore: true
      - title: movement
        type: integer
        ignore: true

# data.csv
time,pulse,movement
0,67,0
15,45,1
126,132,1

sanitise_string! 的第一个参数必须是字符串字面量或扩展为字符串字面量的宏调用。第二个参数必须是解析为 CSV 格式 &str 的表达式。在上面的示例中,sanitise_config.yaml 必须位于 main.rs 旁边,并且 data.csv 必须在运行时位于工作目录中。

另一个宏 sanitise! 用于数据已经被解析成正确形状的情况。有关更多详细信息,请参阅文档

配置

有关配置文件的详细信息,请参阅规范

可选功能

  • benchmark:打印完成各种阶段所需的时间。禁用 no_std 支持。你可能不希望这样。

效率

宏为每个列创建线性有限自动机来处理。如果对于特定列将 on-invalid 设置为 average,则该列的自动机将使用状态机来跟踪有效和无效值。如果忽略列,则不会为其生成自动机。所有数据都存储在原生 Rust 类型中。

许可证

根据以下任一许可证授权:

供您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交并包含在工作中的任何贡献都应作为上述双重许可,不附加任何额外条款或条件。

依赖项

~0.5–1MB
~23K SLoC