たぶんWindows8- 10も可能
インストール
ドライバは複数紹介されているので、システムが許す限り最新のものをインストールする。
特にMDAC(Text-Driver系)
2007 Office system ドライバ: データ接続コンポーネント
Office2010のDB Engine
のAccessDatabaseEngine_X64.exe
C:¥WINDOWS¥SysWOW64¥odbcad32.exe
起動
64bit OSでADODBテキストドライバを使う
Microsoft Text Driverと Microsoft Access Driverを構成する
しかしこれは32bitだが気にしない
VBScriptはどうせ32bit強制起動のため、以下のような影響を受けないのです。
カテゴリー>64ビット版Windows環境に、32ビット版/64ビット版双方のMicrosoft Access ODBCドライバを共存させる方法
設定
フォルダ
c:\hoge\
VBscriptファイル名
NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs
重要:必ずCSVファイルと同じフォルダにおいてください
MDBファイル名
アクセスのファイル形式はmdb、ファイル名はnew.mdbです。ファイルの位置は上記フォルダです。
重要:このファイルはvbsを起動するたび削除して作成されます。
CSVファイル名
c:\hoge\database.csv
とこのVBSがあり、このフォルダにnew.mdb
を作成し、T_Master
というテーブルを作成する
database.csv
の項目名とデータ型
項目名 | データ型 |
---|---|
col1 | Long |
Col2 | Text(10) |
Col3 | Currency |
Col4 | Datetime |
database.csv
の中身
qiita.comでは斜めになっていますが、col2は通貨型なので円マークで入っています。(なお、何が通貨型かは厳密に言うとWindowsの国というか文化というかLocaleとで決まります。)
col1,col2,col3,col4
1,a,\1000,2018/4/9
2,b,\2000,2018/4/28
3,c,\3000,2018/5/12`
4,c,\3000,2018/5/12
5,c,\3000,2018/5/12
6,c,\6000,2018/5/12
Point
32bit強制起動
CMD.Exe で'%SystemRoot%\SysWow64\cscript.exe //Nologo "C:\hoge\NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs"
とするか下記のように32Bit強制します。ここがポイントです。そのままだと動かないのです。
大体whitire.com/vbs/`のTipsを使う
http://www.whitire.com/vbs/tips0140.html
大体tipsの140くらいからです。
これらは実は32Bit強制すると、64bitでも動きます。
しかし現在これらのTipsは32bit強制を知らないと使えません。
またサイトでも使われているので、便宜上MDACを入れましたが、本記事ではProviderはできる限りJetに置き換えます。今後はMDACに移行する予定とのことですが、Jetが強力で安定しているためです。
レポートは必須
タイトルの設定を見てください。
mdbファイルはオフィスがないので直接は読めないのです。
このため、テキスト出力はTipsにもありましたが、テーブルに作成できるとしても必要です。
でないとSQLの結果が分からないからです。
Option Explicit
'32bit 強制起動
'http://scripting.cocolog-nifty.com/blog/2011/02/wsh6432bit-b32d.html
If InStr(LCase(WScript.FullName),"system32") Then
If CreateObject("Scripting.FileSystemObject").FileExists(Replace(LCase(WScript.FullName),"system32","syswow64")) Then
CreateObject("WScript.Shell").Run """" & Replace(LCase(WScript.FullName),"system32","syswow64") & """ """ & WScript.ScriptFullName & """"
WScript.Quit
End If
End If
'%SystemRoot%\SysWow64\cscript.exe //Nologo "C:\hoge\NewMDB作成Tbl作成ANSICSVからTBLへ読レポありトラあり.vbs"
'定数宣言
Const INPUTFILENAME = "database.csv"
Const adOpenDynamic =2
const adOpenKeyset = 1
const adLockOptimistic = 3
'変数宣言
Dim i
Dim objADO
Dim objRS
Dim strID
Dim strPath
Dim objCN
Dim objDAO
Dim objaRs
Dim sSQL
Dim cat,ib,aRs
'初期値
i = 0
strID = 1
If IncludeAdoDefine() = True Then
WScript.Echo "定義ファイルを読み込みました。"
End If
'既存のmdbがあれば削除
With CreateObject("Scripting.FileSystemObject")
If .FileExists("C:\hoge\new.mdb") Then .DeleteFile "C:\hoge\new.mdb"
End With
'mdbの作成 Via https://blogs.yahoo.co.jp/lockin_break/37662072.html
Set cat = CreateObject("ADOX.Catalog")
cat.Create "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"
'/// 作成したDBにT_Masterという名前のテーブルを作る テーブル作成クエリ(アクションクエリ)
Set objCN = CreateObject("ADODB.Connection")
objCn.Open "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"
'//// Tableの作成 名前はtest
sSQL = "CREATE TABLE T_Master(Col1 Long,Col2 Char(10),Col3 Currency,Col4 DateTime);"
objCN.Execute sSQL , , adExecuteNoRecords
objCN.Close
'スクリプトファイルが実行している場所のパスを取得
strPath = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
'ADOを使いCSVファイルを扱う準備
Set objADO = CreateObject("ADODB.Connection")
Set objCN = CreateObject("ADODB.Connection")
Set objDAO =CreateObject("DAO.DBEngine.36")
Set objaRS = CreateObject("ADODB.RecordSet")
Set aRS = CreateObject("ADODB.RecordSet")
objADO.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & _
strPath & ";ReadOnly=1"
'SQLを実行して、対象データをCSVファイルから抽出してファイルに出力
sSQL = "SELECT * FROM C:\hoge\database#csv;"
Set objaRS = objADO.Execute(sSQL)
Do While Not objaRS.EOF
call WriteLog(objaRS("col1").Value & "," & _
objaRS("col2").Value & "," & _
objaRS("col3").Value & "," & _
objaRS("col4").Value , 1)
i = i + 1
objaRS.MoveNext
Loop
objaRs.MoveFirst
objCn.Open "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='C:\hoge\new.mdb'"
objCN.BeginTrans '[[トランザクション処理を行う]](http://www.whitire.com/vbs/tips0151.html)
aRS.Open "SELECT * FROM T_master;",objCN,1,3
Wscript.Echo aRS.Fields(0).name & "," & aRS.Fields(1).name
Do While Not objaRS.EOF
On Error Resume Next
aRs.AddNew
for ib=0 to aRs.Fields.Count-1
aRS.Fields("col" & ib + 1).value =objaRS.Fields(ib).value
Next
aRs.Update
If err.number <> 0 Then WScript.Echo "Err!" : objCn.RoolBackTrans:Exit Do 'ERR RISE then Exit Do Loop
objaRS.MoveNext
Loop
if objars.eof=true And err.number = 0 then objCN.CommitTrans
'オブジェクトのクローズ&破棄
objaRS.Close
Set objaRs = Nothing
objADO.Close
Set objADO = Nothing
'処理終了メッセージ
WScript.Echo "処理が終了しました。"
'処理終了
WScript.Quit
'結果出力処理
Sub WriteLog(strMsg,blnFLG)
Const LOGFILENAME = "Report.log"
Dim objFSO
Dim objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
If blnFLG = 0 Then
'ログファイルが存在する場合は削除
If objFSO.FileExists(strPath & LOGFILENAME) = True Then
objFSO.DeleteFile strPath & LOGFILENAME
End If
'ログファイルを作成
objFSO.CreateTextFile "C:\hoge\" & LOGFILENAME
End If
'追記で開く
If objFSO.FileExists("C:\hoge\" & LOGFILENAME)=False Then objFSO.CreateTextFile "C:\hoge\" & LOGFILENAME
Set objFile = objFSO.OpenTextFile("C:\hoge\" & LOGFILENAME, 8)
'メッセージを書き込み
objFile.WriteLine strMsg
'オブジェクトの破棄
Set objFile = Nothing
Set objFSO = Nothing
End Sub
Function IncludeAdoDefine()
'[定数ファイルを(adovbs.inc)を読み込む](http://www.whitire.com/vbs/tips0138.html)
Dim blnRetCode ' 戻り値
Dim objFSO ' FileSystemObject
Dim strIncFile ' 定数定義ファイル
Dim objIncFile ' 定数定義ファイル
Dim strReadLine ' ファイル読み込みバッファ
On Error Resume Next
blnRetCode = True
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
strIncFile = "C:\Program Files\Common Files\System\ado\adovbs.inc"
Set objIncFile = objFSO.OpenTextFile(strIncFile)
If Err.Number = 0 Then
Do While objIncFile.AtEndOfStream <> True
strReadLine = Trim(objIncFile.ReadLine)
' コメント行などで無かったら読み込む
If Left(strReadLine, 1) <> "'" And _
strReadLine <> "" And _
strReadLine <> "<%" And _
strReadLine <> "%>" _
Then
ExecuteGlobal strReadLine
End If
Loop
objIncFile.Close()
Else
WScript.Echo "エラー:" & Err.Description
blnRetCode = False
End If
Else
WScript.Echo "エラー:" & Err.Description
blnRetCode = False
End If
Set objIncFile = Nothing
Set objFSO = Nothing
IncludeAdoDefine = blnRetCode
End Function