VB.NETのレガシーコードを眺めていたところ、1つの文字列を特定文字列で分割し配列に収めるという処理を力技でやっている関数にぶち当たった。だいたいこんな感じ。
orgStr = "あ,いうえ,お"
delim = ","
d1 = 0
d2 = 0
Do
' 次の区切り文字の位置を取得
If i = 0 Then
d2 = InStr(1, orgStr, Chr(delim))
Else
d2 = InStr(d1 + 1, orgStr, Chr(delim))
End If
If d2 > 0 Then
' 次の区切り文字までの部分文字列を配列に取得
If i = 0 Then
destArr(i) = Mid(orgStr, 1, d2)
Else
destArr(i) = Mid(orgStr, d1 + 1, d2 - d1)
End If
Else
' 最後の区切り文字以降の部分文字列を配列に取得
If i = 0 Then
destArr(i) = orgStr
Else
destArr(i) = Mid(orgStr, d1 + 1)
End If
Exit Do
End If
i += 1
d1 = d2
Loop
For Each row As String In destArr
Console.WriteLine(row)
Next
出力はまあこうなる
あ
いうえ
お
解析にも時間がかかってしまった。
似たような配列を生成する関数を作る必要が出てきたが、さすがにこの処理をまるっと採用することには抵抗感を禁じ得ない。VBには明るくないが、もっと楽な方法はないものか。
やれやれ。僕は検索した。
検索結果
あるじゃねーの。
こちらはVBAで、厳密に同じ関数ではないのだが、Limitの使い方は同じようなイメージでよさそう
書き換え
orgStr = "あ,いうえ,お"
delim = ","
destArr = Split(orgStr, Chr(delim), -1)
For Each row As String In destArr
Console.WriteLine(row)
Next
そしてこうなる
あ
いうえ
お
1行にまとまった。標準関数を信じろ。
おまけ
配列Aarr1
の添字0以降の要素を5個、配列Barr2
の添字3以降にコピーする。
Array.Copy(arr1, 0, arr2, 3, 5)