18 个版本
0.3.0 | 2023 年 1 月 29 日 |
---|---|
0.2.7 | 2023 年 1 月 28 日 |
0.2.5 | 2022 年 7 月 16 日 |
0.1.9 | 2022 年 6 月 16 日 |
#779 在 文件系统
67 每月下载量
93KB
2K SLoC
tdms
tdms
是一个用 Rust 编写的 LabVIEW TDMS 文件解析器库。这个库旨在成为一个通用的库,用于读取和执行对文件中包含的数据的任何计算工作。
注意:这个库仍在开发中。虽然我不期望当前的功能签名和库结构会改变,但由于早期采用,您可能会遇到一些困难。功能目前有限。原始数据通道迭代器将逐步添加,并将保持一个列表,指示哪些是可用的,哪些正在建设中。
当前功能
- 读取标准和大端编解码的文件
- 读取带有 DAQmx 数据和数据索引的文件
- 读取文件中的所有段,包括它们的组和通道(每个段只限)
- 读取文件中所有段中包含的所有原始数据(目前只以
Vec<u8>
的形式) - 使用
log
api 进行日志记录 - 库的用户必须选择并初始化实现,例如env-logger
以下是所有支持的 TDMS 数据类型迭代器的列表。如果完全未列出,则表示该类型尚未支持。请经常查看,因为这个列表会很快增长。
数据类型 | 标准 | 交错 | DAQmx |
---|---|---|---|
双精度浮点数 | ✓ | ✓ - 未测试 | ✗ |
单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
带单位的单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
带单位的双精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
复数单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
复数双精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
I8 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
I32 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
I64 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
U8 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
U16 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
U32 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
U64 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
布尔值 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
时间戳(返回元组) | ✓ - 未测试 | ✓ - 未测试 | ✗ |
单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
单精度浮点数 | ✓ - 未测试 | ✓ - 未测试 | ✗ |
字符串 | ✓ - 未测试 | ✗ | ✗ |
计划中的功能
- 每个通道类型的迭代器,从编码数据通道返回原生 Rust 值
- DAQmx 数据通道迭代器支持
- 在字符串通道中搜索
使用方法
extern crate tdms;
use std::path::Path;
use tdms::data_type::TdmsDataType;
use tdms::TDMSFile;
fn main() {
// open and parse the TDMS file, passing in metadata false will mean the entire file is
// read into memory, not just the metadata
let file = match TDMSFile::from_path(Path::new("data/standard.tdms")) {
Ok(f) => f,
Err(e) => panic!("{:?}", e),
};
// fetch groups
let groups = file.groups();
for group in groups {
// fetch an IndexSet of the group's channels
let channels = file.channels(&group);
let mut i = 0;
for (_, channel) in channels {
// once you know the channel's full path (group + channel) you can ask for the full
// channel object. In order to fetch a channel you must call the proper channel func
// depending on your data type. Currently this feature is unimplemented but the method
// of calling this is set down for future changes
let full_channel = match channel.data_type {
// the returned full channel is an iterator over raw data
TdmsDataType::DoubleFloat(_) => file.clone().channel_data_double_float(channel),
_ => {
panic!("{}", "channel for data type unimplemented")
}
};
let mut full_channel_iterator = match full_channel {
Ok(i) => i,
Err(e) => {
panic!("{:?}", e)
}
};
println!("{:?}", full_channel_iterator.count());
i += 1;
}
}
}
贡献
欢迎提交拉取请求。对于重大更改,请首先打开一个问题来讨论您想要更改的内容。
请确保适当地更新测试。
许可证
依赖
~4MB
~80K SLoC