投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/10/16 19:16:15
> なお今回、途中に 4 列構成ではない行(たとえば6列ある行や2列しか無い行など)が
> 含まれていた場合、エラーにするのではなく、その行の存在を無視するようにしています。
> そのため、配列のインデックスは 0 から始まる番号としてはいますが、
> このインデックスは、元のテキストの行番号と必ずしも一致するとは限らない点にご注意を。

別解。

前回は、4 列構成ではない行があった場合に、その行を読み飛ばす仕様にしたため、
行番号がスキップされるケースがありましたが、今回は行番号がずれないようするために、
「5 列以上なら後続列を無視、3列以下なら不足列の値を 0 とみなす」実装にしてみました。

今回は LINQ を使わずに書いてみます。

'Imports System.IO 
'Imports System.Text 

'ファイル名と文字コードは適宜修正すること 
Dim fileName As String = "C:\test\example.txt"
Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")

'今回は先に件数を調べるので、ReadLines ではなく ReadAllLines を使う 
Dim lines As String() = File.ReadAllLines(fileName, enc)

'配列の事前準備が必要なところまでは同じ 
Dim upperIndex As Integer = lines.GetUpperBound(0)
Dim A(upperIndex), B(upperIndex), C(upperIndex), D(upperIndex) As Integer

'数値化処理。CInt で数値化しても良いけれど、それだと変換エラー時に止まってしまうので…。 
Dim FillInt = Sub(inText$, ByRef outInt%) Integer.TryParse(inText, outInt)

Dim splitter As Char() = $" {vbTab} ".ToCharArray()
Dim separator = StringSplitOptions.RemoveEmptyEntries
For rowIndex = 0 To upperIndex
    '前回は Replace で vbTab 区切りに揃えたけれど、よく考えたら直接 Split すれば十分だった 
    Dim columns() As String = lines(rowIndex).Split(splitter, separator)

    '別々の変数にセットする必要がなければ、こんな回りくどい処理をしなくて済むのだけれど… 
    If columns.Length >= 1 Then FillInt(columns(0), A(rowIndex))
    If columns.Length >= 2 Then FillInt(columns(1), B(rowIndex))
    If columns.Length >= 3 Then FillInt(columns(2), C(rowIndex))
    If columns.Length >= 4 Then FillInt(columns(3), D(rowIndex))
Next