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 let mut rdr = BufReader::new(File::open(path)?).lines();
14
15 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 let n = self.n as usize; 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}