Как перебрать / передать 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,

Другие вопросы по тегам