Как перебрать / передать gzip-файл (содержащий один csv)?
Как перебрать gziped файл, который содержит один текстовый файл (csv)?
В поисках 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 ответ
Для потоковых операций ржавчина имеет Read
а также Write
черты. Для перебора ввода по строкам вы обычно хотите 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());
}
}
Затем вы можете декодировать свои строки с помощью обычной ("без gzip") логики; возможно, сделайте это универсальным, взяв любой ввод, реализующий BufRead
,