#grib #grib2 #parser #reader #version #reading #async

grib2_reader

一个能够读取和解析GRIB版本2文件的简单库

3个版本

0.1.2 2024年5月3日
0.1.1 2024年4月27日
0.1.0 2024年4月27日

#121 in 模板引擎

MIT/Apache

34KB
635

GRIB2 Reader

这个库旨在完成两件事

  1. 使用tokio和async将合并的grib2文件切割成更小的单个grib2部分。
  2. 解析单个grib2文件,从一个Vec<u8> blob中(不使用tokio和async)。

用法

如果您想使用异步功能,请将此添加到您的Cargo.toml中

[dependencies]
grib2_reader = { version = "0.1.2", features = ["async"] }

如果您只想解析单个grib2文件,请将此添加到您的Cargo.toml中

[dependencies]
grib2_reader = "0.1.2"

示例

计算组合grib2文件中单个grib2文件的数量。

use grib2_reader::{Grib2Reader, Grib2Error};

async fn read_all() -> Result<(), Grib2Error> {
        let f = File::open("data/HARMONIE_DINI_SF_5.grib").await?;

        let mut b_reader = BufReader::new(f);
        let file_length = b_reader.seek(SeekFrom::End(0)).await?;
        let mut reader = Grib2Reader::new(b_reader);

        let mut count = 0;
        loop {
            match reader.read_binary_next(file_length).await {
                Ok(data) => {
                    if data.is_empty() {
                        println!("All done");
                        break;
                    }

                    // Here data is a Vec<u8> of the contained grib2 data

                    count += 1;
                }
                Err(Grib2Error::EOF) => {
                    println!("EOF");
                    break;
                }
                Err(err) => {
                    println!("Err: {:?}", err);
                    break;
                }
            };
        }

        println!("File count: {}", count);

        Ok(())
    }

当您只想解析单个grib2文件时

use grib2_reader::{Grib2Parser, Grib2Error};

fn parse_single() {
    let mut f = File::open("data/HARMONIE_DINI_SF_5.grib").expect("Unable to open file");

    let mut data = vec![];
    f.read_to_end(&mut data).expect("Unable to read file");

    let mut grib2_parser = Grib2Parser::new();
    let mut grib = grib2_parser.parse(data).expect("Unable to parse grib2 file");

    println!("Results:");
    // We don't want to display the binary data, so remove that from the output
    grib.data[0].data = vec![];
    println!("{:#?}", &grib);
}

依赖项

~0.4–2MB
~39K SLoC