Treeコマンドの結果から階層を指定して取り出すスクリプトのアルゴリズム
2023年04月11日
前回「Treeコマンドの結果から階層を指定して取り出すスクリプトの検討」の続き。
悩んでいた判定処理について、思いついた。
当たり前ではあるけど、任意の文字の部分は何も記述しなければいいんだ!
それを踏まえて、1~3階層の特徴は以下の通り。
悩んでいた判定処理について、思いついた。
当たり前ではあるけど、任意の文字の部分は何も記述しなければいいんだ!
それを踏まえて、1~3階層の特徴は以下の通り。
1階層目
・3バイト目に─(罫線)が登場する。
2階層目
・3バイト目と4バイト目がスペース2つ。
・7バイト目と8バイト目に─(罫線)が登場する。
3階層目
・3バイト目、4バイト目、7バイト目、8バイト目がスペース2つ。
・9バイト目と10バイト目に─(罫線)が登場する。
これを一般化してn階層だと。。。
n階層目
・4n-1バイト目に─(罫線)が登場する。
・任意のk(0<k<n)に対して、4k-1バイト目および4kバイト目がスペース。
考えた処理
・出力結果に対して─(罫線)の位置(=p)を検索する。
・n=(p+1)/4より、p+1が4で割り切れること
・任意のk=1~n-1で、4k-1バイト目および4kバイト目がスペース。
・出力すべきテキストなら階層を返す。出力すべきでないテキストなら0を返す。
上記の内容について
入力した文字列が何階層目を出力した文字かを判定する関数としてまとめた。
function gettarLV(textLine)
dim p
p = instrB(textLine,"─") '罫線のPositionをバイトで返す
dim mFlag
mFlag = p +1 mod 4
dim k, tarLV, oFLag
if mFlag = 0 then
oFlag = 1
for k = 1 to n -1
if midB(textLine,4*k -1,2) = " " then 'スペース2つ
oFlag = 0
exit for
end if
next
tarLV = 0
if oFlag = 1 then tarLV = (p+1)/4
end if
gettarLV = tarLV
end function
これで動くはずがダメ。。。
pの値を確認したところ、p=3,7,9,13の想定が
3,9,15,21,29,23,17という感じでバラバラ。
どうやらinstrB関数の位置判定がうまくいってないらしい。
原因は、テキストをunicodeとして処理する関係で、
半角スペースが2バイトとしてカウントされるため。
俺の2時間かえせー!!!
[ExcelVBA] バイト単位の切り出し注意
https://propg.ee-mall.info/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/vba/excelvba-%E3%83%90%E3%82%A4%E3%83%88%E5%8D%98%E4%BD%8D%E3%81%AE%E5%88%87%E3%82%8A%E5%87%BA%E3%81%97%E6%B3%A8%E6%84%8F/
の記事を読んで使ったみたものの、
以下の記事のとおりVBScriptじゃ、文字コート変換はできないらしい。
VBScriptでStrConvは使えない
https://taka-2.hatenablog.jp/entry/20060930/p1
過去にもmidBを使って失敗した経験があるけど、そういう理由だったのかぁ。
テストで使用したスクリプトは こちら。残骸です。。。
PR
Comment