rsv_lib/csv/
flatten.rs

1use crate::args::Flatten;
2use crate::utils::cli_result::CliResult;
3use crate::utils::file;
4use crate::utils::table::Table;
5use std::fs::File;
6use std::io::{BufRead, BufReader};
7
8impl Flatten {
9    pub fn csv_run(&self) -> CliResult {
10        let path = &self.path();
11
12        // open file and header
13        let mut rdr = BufReader::new(File::open(path)?).lines();
14
15        // header
16        let columns: Vec<String> = if self.no_header {
17            match file::column_n(path, self.sep, self.quote)? {
18                Some(n) => (1..=n).map(|i| format!("col{i}")).collect::<Vec<_>>(),
19                None => return Ok(()),
20            }
21        } else {
22            match rdr.next() {
23                Some(r) => self.split_row_to_owned_vec(&r?),
24                None => return Ok(()),
25            }
26        };
27
28        // read file
29        let n = self.n as usize; // overflow is allowed when self.n is negative.
30        rdr.take(n).flatten().enumerate().for_each(|(i, l)| {
31            println!(" {} row{}", &self.delimiter, i + 1);
32
33            let r = self
34                .split(&l)
35                .zip(&columns)
36                .map(|(v, k)| [k.as_str(), v])
37                .collect::<Vec<_>>();
38            Table::from_records(r).print_blank().unwrap();
39        });
40
41        Ok(())
42    }
43}