rsv_lib/excel/
frequency.rs1use 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 let mut rdr = ExcelReader::new(path, self.sheet)?;
16
17 let col = Columns::new(&self.cols).total_col(rdr.column_n()).parse();
19
20 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 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 if self.n > 0 {
53 freq.truncate(self.n as usize)
54 }
55
56 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}