0

テキスト ファイルの各行を解析しようとしていますが、「System.IndexOutOfRangeException」というエラーが発生し続けます。

「servers.lst」の各行は次のように並べられています。

サーバー名|サーバー ホスト|サーバー ポート|サーバー URL|クライアント タイプ|クライアント バージョン|クライアント URL

各行は 1 つのサーバーを表します。しかし、正しく解析できません。完全なファイル、空の変数、またはエラーのいずれかを返します。

これが私のコードです:

Dim reader As String = My.Computer.FileSystem.ReadAllText("servers.lst")
    Dim s() As String
    Dim TotalServers As String = reader.Length
    Dim x As Integer = 0
    Dim myArray As String() = reader.Split("|"c)
    For x = 1 To TotalServers
        Servers(x).ServerName = myArray(0)
        Servers(x).ServerIP = myArray(1)
        Servers(x).ServerPort = myArray(2)
        Servers(x).ServerURL = myArray(3)
        Servers(x).Client = myArray(4)
        Servers(x).ClientVer = myArray(5)
        Servers(x).ClientURL = myArray(6)
        Form1.ListBox1.Items.Add(Servers(x).ServerName)
        x += 1
    Next

各サーバーの名前を返そうとしていますが、問題があります。

*編集:ここに私の構造コードがあります:

Structure ServerData
    Public ServerName As String
    Public ServerPort As Long
    Public ServerURL As String
    Public ServerIP As String
    Public Client As String
    Public ClientVer As String
    Public ClientURL As String
End Structure
Public Servers As ServerData()

ありがとうございました。

4

4 に答える 4

6

これLengthは文字列の長さ (文字単位) であり、予想される行数ではありません。また、Dim TotalServers As String = reader.Lengthあまり意味がありません。おそらく、予想されるサーバー メンバーが含まれるクラスの汎用リストを使用する必要があります。

したがって、ファイルを 1 行ずつ読み取って各行を処理し、サーバー クラスの新しいインスタンスを作成して、現在行っているようにメンバーを割り当てる必要があります。

于 2012-12-10T02:18:21.607 に答える
4

このコード行は正しくないようです

Dim TotalServers As String = reader.Length

まず、新しい行に基づいてファイルを分割する必要があります。次に、すべての新しい行に基づいて新しく作成された配列から、別の配列を作成し、「|」で分割します サイン。

これが私のショットです。このコードはテストされていません。その場で書くだけですが、アイデアを得る必要があると思います。

Dim reader As String = My.Computer.FileSystem.ReadAllText("servers.lst")
Dim x As Integer = 0
Dim arg() As String = {vbCrLf, vbLf}
Dim newLineArr() As String
Dim myArray As String()
newLineArr = reader.Split(arg, StringSplitOptions.None)



For x = 0 To newLineArr.Length - 1

     myArray = newLineArr(x).Split("|"c)

     Servers(x).ServerName = myArray(0)
     Servers(x).ServerIP = myArray(1)
     Servers(x).ServerPort = myArray(2)
     Servers(x).ServerURL = myArray(3)
     Servers(x).Client = myArray(4)
     Servers(x).ClientVer = myArray(5)
     Servers(x).ClientURL = myArray(6)
     Form1.ListBox1.Items.Add(Servers(x).ServerName)


Next
于 2012-12-10T03:35:24.743 に答える
2

とにかくリスト全体をメモリに読み込む場合は、文字列配列を返すIO.File.ReadAllLinesを使用することもできます。

Dim serverDataArray as String() = IO.File.ReadAllLines("servers.lst")
For each server As String In serverDataArray
    Dim serverData as String() = server.Split("|"c)
    Servers(x).ServerName = serverData(0)
    'etc
Next
于 2012-12-10T06:35:45.857 に答える
2

ループ内で x の値を変更しています。これは、ループ コンストラクトによって処理されます。ラインを削除x += 1

この行にデータ型が混在している別のコードの問題があります。Length 呼び出しは整数を返します。これは暗黙的に文字列に変換できますが、効率が悪く、長期的には混乱を招く可能性があります。ルセロの回答で述べたように、文字列の長さを取得しても、元のファイルに何行あったかはわかりません。

' Avoid
' Dim TotalServers As String = reader.Length

' Better - data types are correct but value is wrong
' Dim TotalServers As Integer = reader.Length

' Accurate type and correct count
Dim TotalServers As Integer = (reader.Split(vbCrLf)).Length

そして、この回答を修正して、あなたのイテレーションを取り巻くさらなる課題について話し合うと、reader@sicKo がより優れた、より VB.NET 風のアプローチを提供したことがわかります。

私のVB.NETの無知を示​​しています(他のC#志向の人々がこれを読んだ場合に備えて残されています)

また、あなたのラインは疑わしいようです。それを精神的に解析するとc、構文エラーが発生するはずです。

Dim myArray As String() = reader.Split("|"c)
于 2012-12-10T02:15:15.753 に答える