我试图解析文本文件的每一行,但它始终给我一个错误'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()谢谢。
发布于 2012-12-10 03:35:24
这一行代码看上去不对
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-10 02:18:21
这里的Length是字符串长度(以字符为单位),而不是您所期望的行数。而且,Dim TotalServers As String = reader.Length没有多大意义;您可能希望使用包含预期服务器成员的类的泛型列表。
因此,您应该逐行读取文件并处理每一行,创建服务器类的新实例,以便像现在这样分配成员。
发布于 2012-12-10 02:15:15
您正在修改循环中的x值。这是通过循环构造来处理的。删除行x += 1
您还有另一个代码问题,即在这一行中混合数据类型。Length调用将返回一个整数,虽然可以隐式转换为string,但它效率低下,很可能导致长期混淆。正如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中看到的围绕您的迭代所面临的进一步挑战时,我看到@ more提供了一种更好、更像VB.NET的方法。
显示我的VB.NET无知(左,以防其他C#的人读到这篇文章)
还有,你的台词似乎有问题。在对其进行解析时,c应该会导致语法错误。
Dim myArray As String() = reader.Split("|"c)https://stackoverflow.com/questions/13794077
复制相似问题