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

时间:2017-11-01 04:02:31

标签: csv rust gzip gzipfile

如何迭代包含单个文本文件(csv)的gziped文件?

正在搜索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);
}

如何流式传输gzip csv文件?

1 个答案:

答案 0 :(得分:2)

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

flate2已经在这些特征中运作; GzDecoder实施ReadGzDecoder::new执行任何实施Read的内容。

示例解码stdin(当然在playground上效果不好):

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());
    }
}

然后,您可以使用通常的(“无gzip”)逻辑解码您的行;或许通过实施BufRead的任何输入使其成为通用的。