質問編集履歴

2

記載したコードをブロックにしていなかったので修正

2023/06/07 07:33

投稿

watya1
watya1

スコア4

test CHANGED
File without changes
test CHANGED
@@ -85,7 +85,7 @@
85
85
  ### 試したこと
86
86
  以下のようにしたら実現するのですが、
87
87
  カウント時とファイル処理時の2回、フォルダ捜査と絞り込みを行っているのが気に食わないです。
88
-
88
+ ```rust
89
89
  fn main() -> Result<(), Box<dyn Error>> {
90
90
  println!("ファイルをまとめます");
91
91
  // エクセルファイルが格納されているフォルダのパス
@@ -159,7 +159,7 @@
159
159
  println!("作成完了!");
160
160
  Ok(())
161
161
  }
162
-
162
+ ```
163
163
 
164
164
 
165
165
  ### 補足情報(FW/ツールのバージョンなど)

1

とりあえず動くコードを試したこととして追記

2023/06/07 07:32

投稿

watya1
watya1

スコア4

test CHANGED
File without changes
test CHANGED
@@ -82,6 +82,86 @@
82
82
  }
83
83
  ```
84
84
 
85
+ ### 試したこと
86
+ 以下のようにしたら実現するのですが、
87
+ カウント時とファイル処理時の2回、フォルダ捜査と絞り込みを行っているのが気に食わないです。
88
+
89
+ fn main() -> Result<(), Box<dyn Error>> {
90
+ println!("ファイルをまとめます");
91
+ // エクセルファイルが格納されているフォルダのパス
92
+ let folder_path = r"\example";
93
+
94
+ // 出力先のパス
95
+ let output_path = r"\example.csv";
96
+ // csv::WriterBuilderに渡す前にBOMを書き込んでおく。
97
+
98
+ println!("保存フォルダ:{}",folder_path);
99
+ println!("ファイル作成中...:{}",output_path);
100
+
101
+ let output = File::create(output_path)?;
102
+ let mut wtr = BufWriter::new(output);
103
+ wtr.write_all(BOM)?;
104
+
105
+ let mut wtr = WriterBuilder::new()
106
+ .terminator(Terminator::CRLF)
107
+ .from_writer(wtr);
108
+
109
+ let file_count: u64 = read_dir(folder_path)?
110
+ .filter_map(|entry| {
111
+ let path = entry.ok()?.path();
112
+ if path.extension().map_or(false, |ext| ext == "xlsx"){
113
+ Some(path)
114
+ }else {
115
+ None
116
+ }
117
+ })
118
+ .count() as u64;
119
+ let pb = ProgressBar::new(file_count);
120
+
121
+ let mut is_head_writed = false;
122
+
123
+ // フォルダ内の各Excelファイルに対して処理を実行
124
+ for file in read_dir(folder_path)? {
125
+ let file_path = file?.path();
126
+ if let Some(extension) = file_path.extension() {
127
+ // 拡張子がxlsxのファイルのみ処理する
128
+ if extension == "xlsx" {
129
+ // エクセルファイルを開く
130
+ let mut workbook: Xlsx<_> = open_workbook(&file_path)?;
131
+ workbook
132
+ .load_tables()
133
+ .unwrap_or_else(|err| eprintln!("IO Error -> {}",err));
134
+
135
+ if let Some(Ok(table)) = workbook.table_by_name("exampleTable"){
136
+ if false == is_head_writed {
137
+ wtr
138
+ .write_record(table.columns())
139
+ .unwrap_or_else(|err| eprintln!("IO Error -> {}",err));
140
+ is_head_writed = true;
141
+ }
142
+ for row in table.data().rows(){
143
+ if "" != row[1].to_string() {
144
+ wtr
145
+ .write_record(row.iter().map(|f|f.to_string()).collect::<Vec<_>>())
146
+ .unwrap_or_else(|err| eprintln!("IO Error -> {}",err));
147
+ }else {
148
+ // データが空なのでskip
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ thread::sleep(Duration::from_millis(5));
155
+ pb.inc(1);
156
+ }
157
+ wtr.flush()?;
158
+ pb.finish_with_message("done");
159
+ println!("作成完了!");
160
+ Ok(())
161
+ }
162
+
163
+
164
+
85
165
  ### 補足情報(FW/ツールのバージョンなど)
86
166
  [dependencies]
87
167
  calamine = "0.20.0"