spcsv/
misc.rs

1use crate::reader::BufReader;
2use crate::*;
3
4pub fn read_n_lines(file: &mut BufReader, next: usize) -> String {
5    let mut result = String::new();
6
7    for _ in 1..=next {
8        let mut buffer = String::new();
9        file.read_line(&mut buffer);
10        result.push_str(buffer.as_str());
11    }
12
13    result
14}
15
16pub fn lines_per_file(file: &File, n_files: usize) -> Option<(usize, usize)> {
17    let total_lines = file.lines() - file.header();
18    let lines = total_lines as f32 / n_files as f32;
19
20    if lines < 1.0 {
21        None /* Cant place less than a row in each file */
22    } else {
23        let lines = lines.floor() as usize;
24        Some((lines, total_lines - lines * n_files))
25    }
26}
27
28pub fn get_target_directory(file: &File) -> String {
29    format!(
30        "{}/{}",
31        current_dir().unwrap().display(),
32        file.base_name().unwrap()
33    )
34}
35
36pub fn gen_paths(file: &File, n_files: usize) -> Vec<String> {
37    let names = misc::gen_names(file, n_files);
38    names
39        .iter()
40        .map(|a| format!("{}/{}", get_target_directory(file), a))
41        .collect()
42}
43
44pub fn gen_names(file: &File, n_files: usize) -> Vec<String> {
45    let mut result = Vec::<String>::new();
46    let base_name = file.base_name().unwrap_or_else(|| {
47        exit(0);
48    });
49
50    for n in 1..=n_files {
51        result.push(format!("{}_{}.csv", base_name, n));
52    }
53
54    result
55}
56
57#[macro_export]
58macro_rules! b_file {
59    ($f: expr) => {
60        $f.clone().lock().unwrap().deref_mut()
61    };
62}