わんすけに聞いてみる WinActor [WinActor]CSVにSQL実行【抽出・削除】

[WinActor]CSVにSQL実行【抽出・削除】

いろいろ聞いてると、システムから取り出したCSVから必要な情報だけ他システムに連携したいけど、Excelでフィルタ編集しつつも、もっかいCSV化する時に数値とか電話番号の先頭が0落ちしないように幅広げて書式設定しなおす。

こんな操作を手順化して作業しているところも少なくない様だ。

直接CSV編集できるライブラリがあった方がいいよねってことで用意してみた。

細かい考え方はいいや、ソースコード頂戴!っていう方はページ最後へどうぞ。

このページのライブラリは、わんすけのライブラリにも追加しておきます。

[WinActor]スクリプト実行ライブラリ

 

1.CSVにSQL実行するという考え方。

ADODBというライブラリを使えば、CSVファイルに対してSQL実行ができます。

ADODBでCSVをロードする時には、ドライバをスクリプトの中で指定する必要があるのですが、今回は、「Microsoft Text Driver (*.txt; *.csv)」というのを使います。

Microsoft Text Driver を使ってCSVファイルをテーブルとして開く際には、いくつかの作法があるので纏めておきます。

 

1.ADODBのインスタンスを生成する。

Set objADO = CreateObject("ADODB.Connection")

 

2.ドライバを指定してコネクションを開く

' 変数 BaseFolderにCSVファイルを配置しているフォルダパスを指定する。
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & BaseFolder & ";ReadOnly=1"

ここで、CSVファイルが保存されているフォルダへのパスをしています。

オプションの最後の「ReadOnly=1」は、UPDATE文を使うときには「ReadOnly=0」にする感じです。

 

3.SQL文を実行する

' テーブルを指定するFROM句にCSVファイル名を指定する。
objADO.Execute("SELECT * FROM [sample.csv] WHERE [No]=1")

コネクション開くときにフォルダパス指定してるので、FROM句でファイル名だけ指定すればOKってこと。

同じフォルダに複数CSVファイルを配置すれば、INNER JOINとかも使えます。

 

2.取り扱いの注意点

まず、データソースとかドライバーのお話。

仮に、ADODB使ったスクリプトをvbsファイルとして保存して実行した時にこんなエラーが出てしまうケースがあります。

 

[Microsoft][ODBC Driver Manager] データソース名および指定された既定のドライバーが見つけりません。

コード:80004005

 

実際、このエラーがでないでvbsとしても実行できる様に環境をセットアップする方法もあるのですが、そこはすこし話が長くなるので興味があればページの最後に参照リンク付けておいたので調べてみて下さい?

 

ただ、WinActorのスクリプト実行ノードで使う分にはWinActor自体がもともとDB接続とかできるようにセットアップされた環境になってるのか、32bitのCScript.exe使ってるのかわかんないけど、上記のエラーはでないと思います?

で、このMicrosoft Text Driverなんだけども、SQLでなんでもできるかっていうと実はDELETE文はサポート外だったりします。

実際に使うとこんなエラーがでます。

[Microsoft][ODBC テキスト Driver] この ISAM では、リンク テーブル内のデータを削除することはできません。

 

なので、この記事のタイトルでは【抽出・削除】としてますが、厳密には削除の処理を実現したい場合には「削除後に残したいレコードの抽出条件でSELECT文を書いて新しいCSVを作る。」という実装方法になります。

 

3.実装例

上記を踏まえ、実装を考えるとこうなります。

Dim BaseFolder, objFS, SrcFN
Dim SrcTxt, OutPutFile, OutPutStr

Set objFS = CreateObject("Scripting.FileSystemObject")

SrcFN = !CSV元ファイル!
partWHERE = !WHERE句!
OutPutFile = !CSV出力ファイル!

' フルパスから格納フォルダパスを取得
BaseFolder = objFS.GetParentFolderName(SrcFN)

If Not objFS.FileExists(SrcFN) Then
  Err.Raise 404, "", "「" & SrcFN & "」ファイルが見つかりません。"
  WScript.Quit
End If

' フルパスからファイル名のみを抽出
SrcFN = objFS.GetFileName(SrcFN)

Set objFS = Nothing

strSQL = "SELECT * FROM [" & SrcFN & "] WHERE " & partWHERE

Set aq = New QueryADO
Set rec = aq.GetRecordFromCSV(BaseFolder, strSQL)

For Each fld In rec.Fields
  OutPutStr = OutPutStr & fld.Name & ","
Next
OutPutStr = OutPutStr & vbNewLine

Do While Not rec.EOF
    lnStr = ""
    For Each fld In rec.Fields
      If Len(lnStr) > 0 Then lnStr = lnStr & ","
      If InStr(rec(fld.Name).Value, ",") > 0 Then
        lnStr = lnStr & """" & rec(fld.Name).Value & """"
      Else
        lnStr = lnStr & rec(fld.Name).Value
      End If
    Next
    OutPutStr = OutPutStr & lnStr & vbNewLine
    rec.MoveNext
Loop
Set aq = Nothing

Write_TEXT OutPutStr, OutPutFile

WScript.Quit
'■ メイン処理ここまで ■ 以下、呼び出し関数 ■

' ADOでCSVにSQL発行
Class QueryADO
  Private objADO
  Private objRS
  
  Public Sub Class_Initialize
    Set objADO = CreateObject("ADODB.Connection")
  End Sub
  
  Public Sub Class_Terminate
    On Error Resume Next
    objRS.Close
    Set objRs = Nothing
    objADO.Close
    Set objADO = Nothing
    On Error GoTo 0
  End Sub
  
  Function GetRecordFromCSV(BaseFolder, pSQL)
    objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & BaseFolder & ";ReadOnly=1"
    Set GetRecordFromCSV = objADO.Execute(pSQL)
  End Function
End Class

Function Write_TEXT(ContentStr, FilePath)
  Dim objFS, objTXT
  On Error Resume Next
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Set objTXT = objFS.OpenTextFile(FilePath, 2, True)
  objTXT.Write ContentStr
  objTXT.close
  Set objTXT = Nothing
  Set objFS = Nothing
  If Err.Number > 0 Then
    Write_TEXT = False
    Err.Clear
  Else
    Write_TEXT = True
  End If
End Function

読み取り対象のCSVがあるかチェックして、SQL文をビルドして実行してテキスト出力と。

 

4.適用イメージはこんな感じかな

備考

CSVに対してSELECT文のSQL実行を行い、結果を別ファイルとしてCSV出力を行います。

WHERE句には、 [項目名]=値 の様な形で抽出条件を指定します。

レコードを削除したい場合は、残したいレコードを選択するWHERE句を指定して下さい。

 

あー・・・、あとSQL知らない人もいるのか?

そのうちコピペライブラリのコンテンツにSQL追加しようかな?


 

※ 参考リンク ※
64bit OSでADODBテキストドライバを使う

64 ビット版の Windows で、ODBC アドミニストレーター ツールが 32 ビットと 64 ビット両方のユーザー DSN を表示する

Microsoft Access 2016 Runtime

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Related Post

[WinActor]ver6リリース[WinActor]ver6リリース

WinActorのバージョン6がリリースされたみたいですね。 まだ資料に目を通しただけですが、なかなか期待できる内容です! 今回のバージョンアップ、なかなかすごいボリュームですよぉ。 全部ではないですが、グッとキタ内容を […]