如何迭代/流式传输 gzip 文件(包含单个 csv)?

Gre*_*reg 3 csv gzip rust gzipfile

如何遍历包含单个文本文件 (csv) 的 gzip 文件?

搜索 crates.io 我发现flate2有以下解压代码示例:

extern crate flate2;

use std::io::prelude::*;
use flate2::read::GzDecoder;

fn main() {
    let mut d = GzDecoder::new("...".as_bytes()).unwrap();
    let mut s = String::new();
    d.read_to_string(&mut s).unwrap();
    println!("{}", s);
}
Run Code Online (Sandbox Code Playgroud)

如何流式传输 gzip csv 文件?

Ste*_*fan 7

对于流 io 操作,rust 具有ReadWrite特征。要按行迭代输入,您通常需要BufRead特征,您始终可以通过将Read实现包装在BufReader::new.

flate2已经以这些特征运作;GzDecoder实施Read,并GzDecoder::new采取任何实施Read

解码标准输入示例(当然在操场上效果不佳):

extern crate flate2;

use std::io;
use std::io::prelude::*;
use flate2::read::GzDecoder;

fn main() {
    let stdin = io::stdin();
    let stdin = stdin.lock(); // or just open any normal file

    let d = GzDecoder::new(stdin).expect("couldn't decode gzip stream");

    for line in io::BufReader::new(d).lines() {
        println!("{}", line.unwrap());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用通常的(“没有 gzip”)逻辑解码您的行;也许通过采取任何输入实现BufRead.