VBScriptでunixの"cut -c"コマンド(バイト指定で部分文字列を得る)
のようなものを作っているのですが、
Set objIn = objFSO.OpenTextFile(objArg(1), 1)
strText = StrConv(MidB$(StrConv(objIn.ReadAll, vbFromUnicode), intStart, intLen), vbUnicode)
と記述して実行するとMidB$の"$"で「文字が正しくありません」と怒られます。
型が指定できないからだと思いますが、別の方法が思いつきません。
どうすればよいのでしょうか?
というか
> StrConv
はVBScriptで使用できましたっけ?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vtorifunctions.asp
関数一覧にないですね。。。
StrConvはエラーはでませんでした。う〜む
一度
> strText = StrConv(MidB$(StrConv(objIn.ReadAll, vbFromUnicode), intStart, intLen), vbUnicode)
を分解してみてはどうでしょうか?
strText = StrConv(objIn.ReadAll, vbFromUnicode)
strText = MidB(strText,intStart, intLen)
strText = StrConv(strText,vbUnicode)
とか。
MidB$ではなくてMidBではどうでしょうか?
($をつけると内部でString型として扱うだけですから)
# といってもMidBも一覧にないけど。
というか、ADODB.Streamがつかえないかなぁ。
Type=adTypeBinaryとReadで。
分解しても変わりませんでした。
MidBで"$"をつけないと、「型が一致しません」と怒られます。
ADODB.Streamを使ってみましたが、うまくいきませんでした。
以下ソースです(vb初めてなので、おかしいところがあるかもしれません。)
**************************************************************
' vbcut.vbs バイト指定で部分文字列を取得する
'
' cscript vbcut.vbs s,l FileName
' s,l : [開始位置],[文字列数]
' FileName : ファイル名
Dim intStart
Dim intEnd
Dim strText
Const adTypeBinary = 1
''文字列の位置を取得
set objArg = wscript.arguments
'for i=0 to objArg.count-1
'wscript.echo objArg(i)
'next
if objArg.count <> 2 then
wscript.echo "コマンドライン引数は2つでなければいけません"
wscript.quit
end if
strCut = objArg(0)
intPosBar = InStr(strCut,",")
if intPosBar=0 then
wscript.echo "第1引数に ',' が含まれていません"
wscript.quit
end if
intStart = CInt(Left(strCut, intPosBar-1))
intEnd = CInt(Mid(strCut, intPosBar+1))
''文字列を取得
Set objStream = CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile objArg(1)
'wscript.echo strconv(objStream.Read, vbUnicode)
strBin = objStream.Read(intStart+intEnd-1)
For i=intStart to LenB( strBin )
strText = strText & MidB(strBin, i, 1) '表示できるが、1文字ごとに改行される
wscript.echo MidB(strBin, i, 1) '文字化け
'wscript.StdOut.Write MidB(strBin, i, 1) '何も表示されない
Next
wscript.echo strText '文字化け
objStream.Close
Set objStream = Nothing
**************************************************************
訂正:引数の「文字列数」は「バイト数」の誤りでした。
すいません。再度訂正です。
strText = strText & MidB(strBin, i, 1) '表示できるが、1文字ごとに改行される
wscript.echo MidB(strBin, i, 1) '文字化け
のコメントが逆でした。
正しくは
strText = strText & MidB(strBin, i, 1) '文字化け
wscript.echo MidB(strBin, i, 1) '表示できるが、1文字ごとに改行される
です。
とりあえず
> strText = strText & MidB(strBin, i, 1)
strText = strText & Chr( AscB( MidB( strBin, i, 1 ) ) )
ならば、全角文字以外ならば表示できました。
文字コード変換をすべてADODB.Streamにまかせることにより
以下の方法で一応出来ているようです。
Call Main()
Public Sub Main()
'********************************
Dim strTargetFilePath ' As String
Dim lngStart
Dim lngLen
strTargetFilePath = "test.txt"
lngStart = 2
lngLen = 6
'*******************************
Dim objReader
Dim objWriter
Dim bytData
Dim strText
Const adTypeBinary = 1
Const adTypeText = 2
Set objReader = CreateObject( "ADODB.Stream" )
Set objWriter = CreateObject( "ADODB.Stream" )
With objReader
.Open
.Type = adTypeBinary
.LoadFromFile strTargetFilePath
.Position = lngStart
bytData = .Read( lngLen )
.Close
End With
With objWriter
.Open
.Type = adTypeBinary
.Write bytData
.Position = 0
.Type = adTypeText
.CharSet = "shift_jis"
strText = .ReadText
.Close
End With
MsgBox strText
Set objReader = Nothing
Set objWriter = Nothing
End Sub
> はVBScriptで使用できましたっけ?
は
VBA の機能で VBScript に含まれていない機能
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsgrpNonFeatures.asp
てのがありました。
やはり StrConv はつかえませんね。
ADODB.Streamにまかせることによりできました。
Blueさんありがとうございます。
ツイート | ![]() |