1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

VB.NETで文字列分割

Last updated at Posted at 2018-10-02

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には明るくないが、もっと楽な方法はないものか。
やれやれ。僕は検索した。


検索結果

文字列を文字列により分割するには?(VB.NET関数活用)

あるじゃねーの。

Split関数の「Limit」の使い方

こちらは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)
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?