#width #fixed #parser #record #reading #serialization #byte

fixed_width

固定宽度数据解析器

9 个版本 (5 个重大更改)

0.6.0 2024年4月23日
0.5.1 2022年6月13日
0.5.0 2022年4月10日
0.4.2 2022年2月16日
0.1.0 2018年7月31日

#329 in 解析器实现

Download history 180/week @ 2024-04-22 22/week @ 2024-04-29 78/week @ 2024-05-06 28/week @ 2024-05-13 197/week @ 2024-05-20 95/week @ 2024-05-27 76/week @ 2024-06-03 67/week @ 2024-06-10 78/week @ 2024-06-17 117/week @ 2024-06-24 111/week @ 2024-07-01 83/week @ 2024-07-08 83/week @ 2024-07-15 97/week @ 2024-07-22 98/week @ 2024-07-29

每月下载量 367 次

MIT 许可证

100KB
2K SLoC

Fixed Width ─ [构建状态][测试] 最新版本 文档

fixed_width 包旨在通过支持 serde 来简化固定宽度文件的读写。

在此情况下,固定宽度意味着文件的每一行都是相同数量的字节。它支持 Unicode,但前提是 Unicode 符合记录指定的字节大小。它还提供了一些有用的抽象,以简化数据到和从固定宽度文件的序列化和反序列化。

用法

作为依赖项添加

[dependencies]
fixed_width = "0.6"

# Optionally, if you are running Rust version 1.30.0 or above and want to derive fixed width field definitions:
fixed_width_derive = "0.6"

在 crate 的根目录下

use fixed_width;

// and if you are using fixed_width_derive:
use fixed_width_derive::FixedWidth;

示例

&str 读取固定宽度数据

use fixed_width::{FixedWidth, Reader};

let data = "1234554321";
let mut reader = Reader::from_string(data).width(5);

for record in reader.string_reader().filter_map(std::result::Result::ok) {
    // Prints "12345" and then "54321"
    println!("{}", record);
}

使用 serde,使用 fixed_width_derive&str 读取数据

use fixed_width::{FixedWidth, Reader};
use fixed_width_derive::FixedWidth;
use serde_derive::Deserialize;

// It is not necessary to use `fixed_width_derive`, you can manually implement the `FixedWidth` trait.
#[derive(FixedWidth, Deserialize)]
struct Record {
    #[fixed_width(range = "0..5")]
    pub n: usize,
}

let data = "1234554321";

let mut reader = Reader::from_string(data).width(5);

for bytes in reader.byte_reader().filter_map(std::result::Result::ok) {
    // You must specify the type for deserialization
    let record: Record = fixed_width::from_bytes(&bytes).unwrap();

    // Prints "12345" and then "54321"
    println!("{}", record.n);
}

文件中有不同记录类型的情况下的数据读取

use fixed_width::{FixedWidth, Reader};
use fixed_width_derive::FixedWidth;
use serde_derive::Deserialize;

#[derive(FixedWidth, Deserialize)]
struct Record1 {
    #[fixed_width(range = "0..1")]
    pub record_type: usize,
    #[fixed_width(range = "1..5")]
    pub state: String,
}

#[derive(FixedWidth, Deserialize)]
struct Record2 {
    #[fixed_width(range = "0..1")]
    pub record_type: usize,
    #[fixed_width(range = "1..5")]
    pub name: String,
}

let data = "0OHIO1 BOB";

let mut reader = Reader::from_string(data).width(5);

while let Some(Ok(bytes)) = reader.next_record() {
    match bytes.get(0) {
        Some(b'0') => {
            let Record1 { state, .. } = fixed_width::from_bytes(bytes).unwrap();
            assert_eq!(state, "OHIO");
        }
        Some(b'1') => {
            let Record2 { name, .. } = fixed_width::from_bytes(bytes).unwrap();
            assert_eq!(name, "BOB");
        }
        Some(_) => {}
        None => {}
    }
}

从文件中读取数据

use fixed_width::Reader;
use std::fs;

// from a file path on disk
let filepath = "/path/to/file.txt";
let mut reader = Reader::from_file(filepath).width(5);

// from a file handle
let file = fs::File::open(filepath);
let mut reader = Reader::from_reader(file).width(5);

许可证

MIT 许可证下授权。

贡献

欢迎提交问题和拉取请求,请为提交的任何更改添加测试和文档(如有必要)。

依赖项

~110–345KB