rsv_lib/csv/
sort.rs

1use crate::args::Sort;
2use crate::utils::cli_result::CliResult;
3use crate::utils::filename::new_path;
4use crate::utils::sort::SortColumns;
5use crate::utils::writer::Writer;
6use std::fs::File;
7use std::io::{BufRead, BufReader};
8
9impl Sort {
10    pub fn csv_run(&self) -> CliResult {
11        let path = &self.path();
12
13        // rdr and wtr
14        let mut rdr = BufReader::new(File::open(path)?).lines();
15        let out = new_path(path, "-sorted");
16        let mut wtr = Writer::file_or_stdout(self.export, &out)?;
17
18        // cols
19        let cols = SortColumns::from(&self.cols)?;
20
21        // header
22        if !self.no_header {
23            let Some(r) = rdr.next() else { return Ok(()) };
24            wtr.write_str_unchecked(r?);
25        }
26
27        // lines
28        let lines = rdr.filter_map(|i| i.ok()).collect::<Vec<_>>();
29
30        // sort
31        cols.sort_and_write(&lines, self.sep, self.quote, &mut wtr)?;
32
33        if self.export {
34            println!("Saved to file: {}", out.display())
35        }
36
37        Ok(())
38    }
39}