質問編集履歴
2
記載したコードをブロックにしていなかったので修正
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
とりあえず動くコードを試したこととして追記
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"
|