teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

ああ

2021/01/11 13:19

投稿

KazuSaka
KazuSaka

スコア640

answer CHANGED
@@ -336,7 +336,7 @@
336
336
 
337
337
  ### 追記3
338
338
  CSVファイルのみを対象にする
339
- '''VBS
339
+ ```VBS
340
340
  '========================
341
341
  ' リスト取得プロシージャ
342
342
  '========================
@@ -362,4 +362,4 @@
362
362
  Set objFolder = Nothing
363
363
  Set objFileSys = Nothing
364
364
  End Sub
365
- '''
365
+ ```

3

2021/01/11 13:18

投稿

KazuSaka
KazuSaka

スコア640

answer CHANGED
@@ -332,4 +332,34 @@
332
332
 
333
333
  inputFile.Close
334
334
  End Sub
335
- ```
335
+ ```
336
+
337
+ ### 追記3
338
+ CSVファイルのみを対象にする
339
+ '''VBS
340
+ '========================
341
+ ' リスト取得プロシージャ
342
+ '========================
343
+ Sub GetFiles(ByVal folderPath, ByRef fileList)
344
+ Dim objFileSys
345
+ Dim objFolder
346
+ Dim objFile
347
+ Dim i
348
+ i = 0
349
+
350
+ Set objFileSys = CreateObject("Scripting.FileSystemObject")
351
+ Set objFolder = objFileSys.GetFolder(folderPath)
352
+
353
+ For Each objFile In objFolder.Files
354
+ IF objFileSys.GetExtensionName(objFile.Name)="csv" Then
355
+ '取得したファイルのファイル名を表示
356
+ redim Preserve fileList(i)
357
+ fileList(i) = folderPath & "/" & objFile.Name
358
+ i = i + 1
359
+ End If
360
+ Next
361
+
362
+ Set objFolder = Nothing
363
+ Set objFileSys = Nothing
364
+ End Sub
365
+ '''

2

2021/01/11 12:49

投稿

KazuSaka
KazuSaka

スコア640

answer CHANGED
@@ -200,4 +200,136 @@
200
200
  input.Close
201
201
  End Sub
202
202
 
203
+ ```
204
+
205
+ ### 追記2
206
+ ANSI形式のCSVファイルを読み込めるように、ReadFileプロシージャを変更しました。
207
+ 出力ファイルの形式もANSI形式になるように変更しました。
208
+
209
+ 変更箇所
210
+ ①WriteFileANSIプロシージャ追加
211
+ ②ReadFileプロシージャ変更
212
+
213
+ ```VBS
214
+ Option Explicit
215
+
216
+ '===========
217
+ ' メイン処理
218
+ '===========
219
+ Dim LineArrM
220
+ Dim LineArrTemp()
221
+ Dim CSV_PATH()
222
+ Dim i
223
+
224
+ GetFiles "./CSV", CSV_PATH '※フォルダ以下のCSVファイルパスを取得
225
+ For i = 0 To UBound(CSV_PATH)
226
+ ReadFile CSV_PATH(i), LineArrTemp '※ファイルのデータを配列に格納
227
+ If i = 0 then
228
+ LineArrM = LineArrTemp '※1ファイル目
229
+ Else
230
+ ListMerge LineArrTemp, LineArrM '※2ファイル目以降は重複をチェックしてマージ
231
+ End If
232
+ Next
233
+
234
+ WriteFileANSI "outputText.csv", LineArrM 'ファイル出力(ANSI)
235
+ 'WriteFile "outputText.csv", LineArrM 'ファイル出力(UTF-8)
236
+
237
+ '<メイン処理はここまで>
238
+
239
+
240
+ '<以下はSubプロシージャ>
241
+ '========================
242
+ ' ファイル書き込み(UTF-8)
243
+ '========================
244
+ Sub WriteFile(ByVal outputPath, ByVal arr)
245
+ Dim output, i
246
+ Set output = CreateObject("ADODB.Stream")
247
+ output.Type = 2
248
+ output.Charset = "UTF-8"
249
+ output.Open
250
+
251
+ for i = 0 To UBound(arr)
252
+ output.WriteText arr(i), 1 '[0:改行なし 1:改行コード付加]
253
+ Next
254
+ output.SaveToFile outputPath, 2
255
+ output.Close
256
+ End Sub
257
+
258
+ '========================
259
+ ' ファイル書き込み(ANSI)
260
+ '========================
261
+ Sub WriteFileANSI(ByVal outputPath, ByVal arr)
262
+ Dim outputFile, fso
263
+ Set fso = WScript.CreateObject("Scripting.FileSystemObject")
264
+ Set outputFile = fso.OpenTextFile(outputPath, 2, True)
265
+ for i = 0 To UBound(arr)
266
+ outputFile.WriteLine arr(i)
267
+ Next
268
+
269
+ outputFile.Close
270
+ End Sub
271
+
272
+ '===================
273
+ ' 重複を削除+マージ
274
+ '===================
275
+ Sub ListMerge(ByVal arrTemp, ByRef arrM)
276
+ Dim i,j
277
+ '※配列Tempで配列Mにない要素だけ配列Mに追加する
278
+ For i = 0 To UBound(arrTemp)
279
+ For j = 0 To UBound(arrM)
280
+ if arrTemp(i) <> arrM(j) then
281
+ '※配列Mにないものは追加
282
+ if UBound(arrM) = j then
283
+ redim Preserve arrM(UBound(arrM) + 1) '配列を+1拡張
284
+ arrM(UBound(arrM)) = arrTemp(i)
285
+ End If
286
+ Else
287
+ '※配列Mにあるものは追加しない
288
+ Exit For
289
+ End If
290
+ Next
291
+ Next
292
+ End Sub
293
+
294
+ '========================
295
+ ' リスト取得プロシージャ
296
+ '========================
297
+ Sub GetFiles(ByVal folderPath, ByRef fileList)
298
+ Dim objFileSys
299
+ Dim objFolder
300
+ Dim objFile
301
+ Dim i
302
+ i = 0
303
+
304
+ Set objFileSys = CreateObject("Scripting.FileSystemObject")
305
+ Set objFolder = objFileSys.GetFolder(folderPath)
306
+
307
+ For Each objFile In objFolder.Files
308
+ '取得したファイルのファイル名を表示
309
+ redim Preserve fileList(i)
310
+ fileList(i) = folderPath & "/" & objFile.Name
311
+ i = i + 1
312
+ Next
313
+
314
+ Set objFolder = Nothing
315
+ Set objFileSys = Nothing
316
+ End Sub
317
+
318
+ '==================================
319
+ ' CSV読み込みプロシージャ(ANSI専用)
320
+ '==================================
321
+ Sub ReadFile(ByVal filePath, ByRef dataList)
322
+ Dim fso,i
323
+ Dim inputFile
324
+ Set fso = WScript.CreateObject("Scripting.FileSystemObject")
325
+ Set inputFile = fso.OpenTextFile(filePath, 1, False, 0)
326
+ i=0
327
+ Do Until inputFile.AtEndOfStream
328
+ redim Preserve dataList(i)
329
+ dataList(i) = inputFile.ReadLine
330
+ i = i + 1
331
+ Loop
332
+
333
+ inputFile.Close
334
+ End Sub
203
335
  ```

1

追記

2021/01/09 14:19

投稿

KazuSaka
KazuSaka

スコア640

answer CHANGED
@@ -78,4 +78,126 @@
78
78
  input.Close
79
79
  End Sub
80
80
 
81
+ ```
82
+
83
+ ### 追記
84
+ 実行ファイルと同じ階層の「CSV」フォルダ以下のファイルを対象に重複削除・ファイル出力の処理を作ってみました。「CSV」フォルダ以下にCSVファイルを配置して試してみてください。CSVファイルはUTF-8にしてください。
85
+
86
+ ```VBS
87
+ Option Explicit
88
+
89
+ '===========
90
+ ' メイン処理
91
+ '===========
92
+ Dim LineArrM
93
+ Dim LineArrTemp()
94
+ Dim CSV_PATH()
95
+ Dim i
96
+
97
+ GetFiles "./CSV", CSV_PATH '※フォルダ以下のCSVファイルパスを取得
98
+
99
+ For i = 0 To UBound(CSV_PATH)
100
+ ReadFile CSV_PATH(i), LineArrTemp '※ファイルのデータを配列に格納
101
+ If i = 0 then
102
+ LineArrM = LineArrTemp '※1ファイル目
103
+ Else
104
+ ListMerge LineArrTemp, LineArrM '※2ファイル目以降は重複をチェックしてマージ
105
+ End If
106
+ Next
107
+
108
+ WriteFile "outputText.csv", LineArrM 'ファイル出力
109
+ '<メイン処理はここまで>
110
+
111
+
112
+ '<以下はSubプロシージャ>
113
+ '===================
114
+ ' ファイル書き込み
115
+ '===================
116
+ Sub WriteFile(ByVal outputPath, ByVal arr)
117
+ Dim output, i
118
+ Set output = CreateObject("ADODB.Stream")
119
+ output.Type = 2
120
+ output.Charset = "UTF-8"
121
+ output.Open
122
+
123
+ for i = 0 To UBound(arr)
124
+ output.WriteText arr(i), 1 '[0:改行なし 1:改行コード付加]
125
+ Next
126
+ output.SaveToFile outputPath, 2
127
+ output.Close
128
+ End Sub
129
+
130
+ '===================
131
+ ' 重複を削除+マージ
132
+ '===================
133
+ Sub ListMerge(ByVal arrTemp, ByRef arrM)
134
+ Dim i,j
135
+ '※配列Tempで配列Mにない要素だけ配列Mに追加する
136
+ For i = 0 To UBound(arrTemp)
137
+ For j = 0 To UBound(arrM)
138
+ if arrTemp(i) <> arrM(j) then
139
+ '※配列Mにないものは追加
140
+ if UBound(arrM) = j then
141
+ redim Preserve arrM(UBound(arrM) + 1) '配列を+1拡張
142
+ arrM(UBound(arrM)) = arrTemp(i)
143
+ End If
144
+ Else
145
+ '※配列Mにあるものは追加しない
146
+ Exit For
147
+ End If
148
+ Next
149
+ Next
150
+ End Sub
151
+
152
+ '========================
153
+ ' リスト取得プロシージャ
154
+ '========================
155
+ Sub GetFiles(ByVal folderPath, ByRef fileList)
156
+ Dim objFileSys
157
+ Dim objFolder
158
+ Dim objFile
159
+ Dim i
160
+ i = 0
161
+
162
+ Set objFileSys = CreateObject("Scripting.FileSystemObject")
163
+ Set objFolder = objFileSys.GetFolder(folderPath)
164
+
165
+ For Each objFile In objFolder.Files
166
+ '取得したファイルのファイル名を表示
167
+ redim Preserve fileList(i)
168
+ fileList(i) = folderPath & "/" & objFile.Name
169
+ i = i + 1
170
+ Next
171
+
172
+ Set objFolder = Nothing
173
+ Set objFileSys = Nothing
174
+ End Sub
175
+
176
+ '========================
177
+ ' CSV読み込みプロシージャ
178
+ '========================
179
+ Sub ReadFile(ByVal filePath, ByRef dataList)
180
+ Dim input
181
+ Set input = CreateObject("ADODB.Stream")
182
+ input.Open
183
+ input.Type = 2
184
+ input.Charset = "UTF-8"
185
+ input.LineSeparator = 10
186
+ input.LoadFromFile filePath
187
+
188
+ '対象ファイルから1行ずつ読み込む
189
+ Dim line
190
+ Dim aryStrings
191
+ Dim i
192
+ i = 0
193
+ Do Until input.EOS
194
+ line = input.ReadText(-2)
195
+ redim Preserve dataList(i)
196
+ dataList(i) = Replace(line, vbCr, "") '改行コード削除(書込時に改行コード付加)
197
+ i = i + 1
198
+ Loop
199
+
200
+ input.Close
201
+ End Sub
202
+
81
203
  ```