parquet_to_excel/lib.rs
1pub mod csv;
2pub mod xlsx;
3pub mod calc;
4pub mod meta;
5pub mod utils;
6#[cfg(feature = "feishu")]
7pub mod feishu;
8
9pub use serde;
10
11pub use csv::{file_to_csv as parq_file_to_csv, folder_to_csv as parq_folder_to_csv};
12pub use xlsx::{file_to_xlsx as parq_file_to_xlsx, folder_to_xlsx as parq_folder_to_xlsx};
13
14// publish to crates.io
15// cargo publish --registry crates-io
16
17
18/// 遍历目录的宏
19/// scan_dir!(root: AsRef<Path>, get_file: bool, [regex=Regex], [ftype=String], [level=int])
20/// root: 根目录
21/// get_file:true-返回文件,false-返回目录
22/// regex: 路径过滤的正则表达式,regex::Regex类型
23/// ftype: 文件类型后缀,比如.xlsx
24/// level: 遍历的层级,0-根目录,1-直接子目录,依次类推
25#[macro_export]
26macro_rules! scan_dir {
27 ( $root:expr, $getFile:expr $(,regex=$regex:expr)? $(,ftype=$ftype:expr)? $(,level=$level:expr)? ) => {
28 {
29 // use walkdir::WalkDir;
30 let iter = walkdir::WalkDir::new($root);
31 $(
32 let mut iter = iter;
33 iter = iter.min_depth($level); // 0-不限制,1-当前目录,2-当前目录的子目录,以此类推
34 iter = iter.max_depth($level);
35 )?
36 iter.into_iter().filter(|f|
37 match f {
38 Err(_) => false,
39 Ok(f) => {
40 if $getFile {
41 let file_name = f.file_name().to_str().as_ref().unwrap().as_bytes();
42 if f.path().is_file() && (!file_name.starts_with(b"~$")) {
43 true $(&& {if $ftype.len() == 0 || file_name.ends_with($ftype.as_bytes()) {
44 true
45 } else {
46 false
47 }})?
48 } else {
49 false
50 }
51 } else {
52 if f.path().is_file() {
53 false
54 } else {
55 true
56 }
57 }
58 }
59 }
60 )
61 $(
62 .filter_map(|f| {
63 match f {
64 Ok(item) => {
65 let path = item.path().display().to_string();
66 match $regex.captures(path.as_str()) {
67 Some(caps) => {
68 let mut cs = vec![];
69 for i in 1..caps.len() {
70 cs.push(caps.get(i).unwrap().as_str().to_string());
71 };
72 Some((item, cs))
73 },
74 _ => None
75 }
76 },
77 _ => None
78 }
79 })
80 )?
81 }
82 };
83}