VBScript バイト指定で部分文字列を得るには?

解決


qutto  2006-01-16 01:46:50  No: 129559

VBScriptでunixの"cut -c"コマンド(バイト指定で部分文字列を得る)
のようなものを作っているのですが、

Set objIn = objFSO.OpenTextFile(objArg(1), 1)
strText = StrConv(MidB$(StrConv(objIn.ReadAll, vbFromUnicode), intStart, intLen), vbUnicode)

と記述して実行するとMidB$の"$"で「文字が正しくありません」と怒られます。
型が指定できないからだと思いますが、別の方法が思いつきません。
どうすればよいのでしょうか?


Blue  2006-01-16 01:57:28  No: 129560

というか
> StrConv
はVBScriptで使用できましたっけ?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vtorifunctions.asp


qutto  2006-01-16 02:14:30  No: 129561

関数一覧にないですね。。。
StrConvはエラーはでませんでした。う〜む


Blue  2006-01-16 02:24:13  No: 129562

一度
> 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も一覧にないけど。


Blue  2006-01-16 02:30:05  No: 129563

というか、ADODB.Streamがつかえないかなぁ。
Type=adTypeBinaryとReadで。


qutto  2006-01-16 04:20:21  No: 129564

分解しても変わりませんでした。
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
**************************************************************


qutto  2006-01-16 04:21:28  No: 129565

訂正:引数の「文字列数」は「バイト数」の誤りでした。


qutto  2006-01-16 04:23:31  No: 129566

すいません。再度訂正です。
    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文字ごとに改行される
です。


Blue  2006-01-16 07:47:13  No: 129567

とりあえず
> strText = strText & MidB(strBin, i, 1) 
strText = strText & Chr( AscB( MidB( strBin, i, 1 ) ) )
ならば、全角文字以外ならば表示できました。


Blue  2006-01-16 09:16:53  No: 129568

文字コード変換をすべて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


Blue  2006-01-16 09:47:06  No: 129569

> はVBScriptで使用できましたっけ?

VBA の機能で VBScript に含まれていない機能
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsgrpNonFeatures.asp
てのがありました。

やはり StrConv はつかえませんね。


qutto  2006-01-24 05:21:28  No: 129570

ADODB.Streamにまかせることによりできました。
Blueさんありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加