こんにちは!今回の記事は、ADO.StreamのPositionについてです。VBScrippt作成中、ADO.StreamのPositionの位置ってどんな感じで取得できるのかな?と疑問に思ったので、スクリプトを動かしながら確認しました。それでは、いってみましょう!
そもそもADO.StreamのPositionとは
ADO.StreamのPositionとは、Streamオブジェクトの位置を取得するプロパティです。取得できる位置はバイト数で取得できます。
Streamの位置をいろいろと調べてみた
Streamの初期位置
Streamの位置を何も移動せずに取得した場合の位置について。ファイルを読み込んですぐに取得した初期Positionは「0」になります。
表示させるサンプルマクロは以下です。メッセージボックスで表示させています。
' 変数定義
Dim objWSArg
Dim strPath
Dim inStream
' 入力ファイルパスの取得
Set objWSArg = WScript.Arguments
If objWSArg.Count = 1 Then
strPath = objWSArg.Item(0)
End If
Set objWSArg = Nothing
' 入力ファイル定義
Set inStream = CreateObject("ADODB.Stream")
inStream.type = 2
inStream.charset = "UTF-8"
inStream.open
inStream.LoadFromFile strPath
' メッセージボックスでPositionの表示
MsgBox(inStream.Position)
ファイルをReadLine(1行ずつ)で読み込み位置取得
ファイルを1行読み込んで、位置を取得するサンプルです。以下のファイルの1行目を読み込んだ後にpositionをメッセージボックスで表示します。
半角英の「abc」と記入された1行目を読み込んだ位置は「8」でした。内訳としては、最初BOMの3Byte+文字列abc3byte+改行2byte=8byteとなります。
1行目のpositionを表示させるサンプルスクリプトは以下です。
' 変数定義
Dim objWSArg
Dim strPath
Dim inStream
' 入力ファイルパスの取得
Set objWSArg = WScript.Arguments
If objWSArg.Count = 1 Then
strPath = objWSArg.Item(0)
End If
Set objWSArg = Nothing
' 入力ファイル定義
Set inStream = CreateObject("ADODB.Stream")
inStream.type = 2
inStream.charset = "UTF-8"
inStream.open
inStream.LoadFromFile strPath
' ReadLine(1行)で読みとり
inStream.ReadText(-2)
' メッセージボックスでPositionの表示
MsgBox(inStream.Position)
ちなみに、For文で、1行ずつ進めていくと位置は以下のように変化します。
「8」→「13」→「18」→「23」→「26」となります。1行目はBOMの3byteが付いていましたが、2行目以降はBOMが付かないので半角文字列3文字分3byte+改行2byteで5byteずつ増えていっています。
全角の日本語の場合は?
日本語の場合は、UTF-8では日本語1文字が3バイトで扱われます。
例えば、ファイルの1行目に「あいうえお」と記入されていた場合、BOM3byte+あいうえお15Byte+改行2byte=20byteとなります。
ファイルをEOF(全行)で読み込み位置取得
ファイルをEOF(ファイルの最後・終端)に位置を動かして読み込む場合のサンプルマクロも載せておきますね。
' 変数定義
Dim objWSArg
Dim strPath
Dim inStream
' 入力ファイルパスの取得
Set objWSArg = WScript.Arguments
If objWSArg.Count = 1 Then
strPath = objWSArg.Item(0)
End If
Set objWSArg = Nothing
' 入力ファイル定義
Set inStream = CreateObject("ADODB.Stream")
inStream.type = 2
inStream.charset = "UTF-8"
inStream.open
inStream.LoadFromFile strPath
' ReadLine(全内容)で読みとり
inStream.ReadText(-1)
' メッセージボックスでPositionの表示
MsgBox(inStream.Position)
BOM付UTF-8の場合のPositionのカウントまとめ
今回の確認で分かったPositionカウント方法(Streamで読み込んだ位置のバイト数)のまとめです。今回BOM付UTF-8で調べたので、その値となり、ファイルの形式によってカウントされるByteが変わりそうですが、参考までに。
BOM | 3Byte |
---|---|
半角英数字 | 1byte |
日本語(ひらがなや漢字) | 3byte |
改行 | 2byte |
さいごに
いかがだったでしょうか。あまり必要とされている情報じゃない気がしたのですが、自分の備忘も兼ねてまとめてみました。それでは、また!