Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5211 / 13646 ツリー ←次へ | 前へ→

【52079】二次元配列からCSVへの出力 くが 07/10/19(金) 11:54 質問[未読]
【52081】Re:二次元配列からCSVへの出力 neptune 07/10/19(金) 14:20 発言[未読]
【52086】Re:二次元配列からCSVへの出力 くが 07/10/19(金) 23:37 お礼[未読]

【52079】二次元配列からCSVへの出力
質問  くが  - 07/10/19(金) 11:54 -

引用なし
パスワード
   ご相談させてください。
既存の数万レコード、数十フィールド(各レコードによって違う)の
CSVファイルの第一フィールドだけに対して文字列の置換をして、
再びCSVファイルとして出力したいのです。
そこでとりあえず置換までは以下のようなコードで上手く行きました。

Option Base 1
Sub a()
  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  Dim ffile As Object
  Dim csvName As String
  csvName = パス\ファイル名

  Dim TmpData As Variant
  Dim DataLine As Variant
  Dim LastRow As Long
  Dim LastCol As Long
  Dim c As Long
  Dim R As Long
  Const ForReading = 1
  
  ' 配列の上限設定
  Set ffile = fso.OpenTextFile(csvName, ForReading)
  LastCol = 1
  Do Until ffile.AtEndOfStream
    DataLine = Split(ffile.Readline, ",")
    If LastCol < UBound(DataLine) Then LastCol = UBound(DataLine)
  Loop
  LastRow = ffile.Line
  ffile.Close
  ReDim TmpData(1 To LastRow, 1 To LastCol)
  
  ' 2次元配列に格納
  Set ffile = fso.OpenTextFile(csvName, ForReading)
  R = 1
  Do Until ffile.AtEndOfStream
    DataLine = Split(ffile.Readline, ",")
    For c = 1 To UBound(DataLine)
      TmpData(R, c) = DataLine(c - 1)
    Next
    R = R + 1
  Loop
  ffile.Close
  
  For R = 1 To LastRow
    置換え処理
  Next
End Sub

ここまででTmpDataには置換え処理が終わったデータが入っているのですが、
それをそのまま文字列に""囲いをつけたりせずそのままCSVファイルで
なるべく高速で出力するにはどのような手段を使えばいいでしょうか。

ADOやDOAを使えば高速に処理できると聞いたのですが、
使ったことが無いのでどういったものか良く判りません。

【52081】Re:二次元配列からCSVへの出力
発言  neptune  - 07/10/19(金) 14:20 -

引用なし
パスワード
   こんにちは

2次元配列に入れるのは後で出力の際に面倒なので、必要なければ
使わない方が楽チンと思います。

>なるべく高速で出力するにはどのような手段を使えばいいでしょうか。
・一気に全データを読み込み
・そのデータに対して置換処理
・それをそのまんま書き込み
ってのはどうでしょうか?

置換処理が複数条件なら読み込み後改行記号で分割、一次元配列に代入、
置換処理、出力

とか。

VBAコマンドならopen ステートメントとprint、put等を使用
FSOならWriteメソッド、WriteLine メソッドなどを使用
します。

【52086】Re:二次元配列からCSVへの出力
お礼  くが  - 07/10/19(金) 23:37 -

引用なし
パスワード
   ありがとうございます。
こちらでも自己解決しました、確かに配列を使う必要はありませんでした。

  Dim FSO As New FileSystemObject
  Dim TS As TextStream
  Set TS = FSO.CreateTextFile(FileName:=NewFile, Overwrite:=True)
  Dim TmpFile As Variant
  TmpFile = FreeFile
  Open OldFile For Input As #TmpFile
'入力ファイルから変換しつつ出力
  Do Until EOF(TmpFile)
    Line Input #TmpFile, strTextLine
    DataLine = Split(strTextLine, ",")
    'ここでDataLine(0)に変換処理
    strTextLine = DataLine(0)
    For C = 1 To UBound(DataLine)
      strTextLine = strTextLine & "," & DataLine(C)
    Next C
    TS.WriteLine strTextLine
  Loop
  Close #TmpFile
  TS.Close

まだテストしていませんが、
これでファイルを開くことも格納することもなく処理できそうです。

5211 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free