rsv_lib/excel/
frequency.rs

1use crate::args::Frequency;
2use crate::utils::cli_result::CliResult;
3use crate::utils::column::Columns;
4use crate::utils::file;
5use crate::utils::filename;
6use crate::utils::reader::ExcelReader;
7use crate::utils::util::print_frequency_table;
8use dashmap::DashMap;
9
10impl Frequency {
11    pub fn excel_run(&self) -> CliResult {
12        let path = &self.path();
13
14        // open file and header
15        let mut rdr = ExcelReader::new(path, self.sheet)?;
16
17        // cols
18        let col = Columns::new(&self.cols).total_col(rdr.column_n()).parse();
19
20        // header
21        let names: Vec<String> = if self.no_header {
22            col.artificial_cols_with_appended_n()
23        } else {
24            let Some(r) = rdr.next() else { return Ok(()) };
25            if col.max >= r.len() {
26                println!("[info] ignore a bad line # {r:?}!");
27                col.artificial_cols_with_appended_n()
28            } else {
29                col.select_owned_vec_from_excel_datatype(r)
30            }
31        };
32
33        // read file
34        let freq = DashMap::new();
35        rdr.iter().skip(rdr.next_called).for_each(|r| {
36            if col.max >= r.len() {
37                println!("[info] ignore a bad line # {r:?}!");
38            } else {
39                let r = col.select_owned_string_from_excel_datatype(r);
40                *freq.entry(r).or_insert(0) += 1;
41            }
42        });
43
44        let mut freq = freq.into_iter().collect::<Vec<(_, _)>>();
45        if self.ascending {
46            freq.sort_by(|a, b| a.1.cmp(&b.1));
47        } else {
48            freq.sort_by(|a, b| b.1.cmp(&a.1));
49        }
50
51        // apply head n
52        if self.n > 0 {
53            freq.truncate(self.n as usize)
54        }
55
56        // export or print
57        if self.export {
58            let new_path = filename::new_path(path, "-frequency").with_extension("csv");
59            file::write_frequency_to_csv(&new_path, &names, freq);
60            println!("\nSaved to file: {}", new_path.display());
61        } else {
62            print_frequency_table(&names, freq)
63        }
64
65        Ok(())
66    }
67}