おはようございます!今回はVBScriptでcsvファイルを処理するサンプルスクリプトを紹介する記事になります。
csvファイルを読み込み、1行ずつ特定の文字列があるか比較して、特定の文字列がその行に含まれていた場合は、別ファイルに書き出すというサンプルです。
具体的な流れとしては、以下です。
- csvファイルを読み込む
- 1行ずつ特定の文字列があるかどうか比較する
- 特定の文字列が含まれていればA.csvへ、含まれていなければB.csvへ
それでは、サンプルスクリプトの紹介へ移りましょう!
サンプルVBScript:文字列比較してcsvファイルを分割する
Stream オブジェクト (ADO)を利用して、ファイルを1行ずつ読み込み、文字比較して2つのファイルに分けるというサンプルスクリプトです。(使い方は後述)
' ★比較文字列
Const cmpChar = "aaa"
' ★書込むファイル1のパスを設定
strOutputFile1Path = "C:\test\A.csv"
' ★書込むファイル2のパスを設定
strOutputFile2Path = "C:\test\B.csv"
' 変数定義
Dim objArg
Dim inFilePath
Dim inStream
Dim outStream1
Dim outStream2
Dim strOutputFile1Path
Dim strOutputFile2Path
' 入力ファイルパスの取得
Set objArg = WScript.Arguments
If objArg.Count = 1 Then
inFilePath = objArg.Item(0)
End If
Set objArg = Nothing
' 入力ファイル定義
Set inStream = CreateObject("ADODB.Stream")
inStream.type = 2
inStream.charset = "shift_jis" ' UTF-8の場合"UTF-8"とする
inStream.open
inStream.LoadFromFile inFilePath
' 出力ファイル1定義
Set outStream1 = CreateObject("ADODB.Stream")
outStream1.Charset = "shift_jis" ' UTF-8の場合"UTF-8"とする
outStream1.LineSeparator = -1
outStream1.Open
' 出力ファイル1定義
Set outStream2 = CreateObject("ADODB.Stream")
outStream2.Charset = "shift_jis" ' UTF-8の場合"UTF-8"とする
outStream2.LineSeparator = -1
outStream2.Open
' 1行ずつ文字列比較
' 文字列が含まれる→outStream1のA.csvへ、含まれない→outStream2のB.csvへ出力
Do while inStream.EOS <> True
nowLine = inStream.ReadText(-2)
If InStr(nowLine, cmpChar) > 0 Then
outStream1.WriteText nowLine, 1
Else
outStream2.WriteText nowLine, 1
End If
Loop
' 出力ファイル1保存
outStream1.SaveToFile strOutputFile1Path, 2
outStream1.Close
' 出力ファイル2保存
outStream2.SaveToFile strOutputFile2Path, 2
outStream2.Close
' 入力ファイルクローズ
inStream.Close
使い方
使い方としては、★マークの部分の変数を編集してください。その行にあるかどうか比較したい文字列「cmpChar」、文字列比較で指定した文字列が含まれていた場合の出力先「strOutputFile1Path」、文字列比較で指定した文字列が含まれていなかった場合の出力先「strOutputFile2Path」です。
実行は、VBScriptファイルに分割したい対象のcsvファイルをドラッグ&ドロップするか、コマンドプロンプトの引数として対象csvファイルを渡します。コマンドプロンプトの引数わたしについては、別記事でまとめていますので、気になる方はどうぞ!
余談:ADODB.StreamとFileSystemObjectオブジェクトについて
VBScriptでファイルを扱うには、ADODB.StreamオブジェクトとFileSystemObjectオブジェクトを使う事ができます。ただ、今回は文字コードを指定する必要があり、ADODB.Streamオブジェクトでの処理としました。文字化けを考慮したかったのです。
どちらを使えばいいの?と思いますが、個人的には文字コードを指定する必要があるかどうかで使い分けています。
さいごに
いかがだったでしょうか。同じようなことを実現したい方の参考に少しでもなれば幸いです。それでは、また!