#width #fixed #fixed-width #data

fixed_width_derive

用于fixed_width crate的派生特质

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日

过程宏 中排名 1172

MIT 许可协议

18KB
230 行代码(不包括注释)

固定宽度
[构建状态][tests] 最新版本 文档

fixed_width crate旨在简化使用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许可证

贡献

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

依赖项

~265–710KB
~17K 行代码(约额外代码行)