如何迭代包含单个文本文件(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文件?
答案 0 :(得分:2)
对于流io操作,rust具有Read
和Write
特征。要按行迭代输入,您通常需要BufRead
特征,通过将Read
实现包装在BufReader::new
中,您可以随时获得该特征。
flate2
已经在这些特征中运作; GzDecoder
实施Read
,GzDecoder::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
的任何输入使其成为通用的。