0

我正在尝试解析文本文件的每一行,但它一直给我一个错误“System.IndexOutOfRangeException”。

“servers.lst”中的每一行都按以下顺序排列:

服务器名称|服务器主机|服务器端口|服务器 URL|客户端类型|客户端版本|客户端 URL

每行代表一个服务器。但我无法正确解析它。它要么返回完整文件、空白变量或错误。

这是我的代码:

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没有多大意义。您可能希望使用具有预期服务器成员的类的通用列表。

因此,您应该逐行读取文件并处理每一行,创建服务器类的新实例,以便您可以像现在一样分配成员。

于 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

您正在修改循环内 x 的值。这是循环构造为您处理的。删除线x += 1

您还有另一个代码问题,其中您在这一行中混合了数据类型。Length 调用将返回一个整数,虽然它可以隐式转换为字符串,但它效率低下并且可能导致长期混乱。正如 Lucero 的回答中所述,获取字符串的长度不会告诉您原始文件中有多少行。

' 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 回答
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 回答