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 解析器实现
每月下载量 367 次
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