首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.NET解析文本文件

VB.NET解析文本文件
EN

Stack Overflow用户
提问于 2012-12-10 02:12:06
回答 4查看 4.6K关注 0票数 0

我试图解析文本文件的每一行,但它始终给我一个错误'System.IndexOutOfRangeException‘。

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

伺服器名称伺服器伺服器端口伺服器埠伺服器URL伺服器型别伺服器型别伺服器版本回覆客户端URL

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

这是我的代码:

代码语言:javascript
复制
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

我试图返回每个服务器的名称,但我遇到了困难。

*编辑:这是我的结构代码:

代码语言:javascript
复制
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()

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-10 03:35:24

这一行代码看上去不对

代码语言:javascript
复制
Dim TotalServers As String = reader.Length

首先,您应该根据新行拆分您的文件。然后,仅从新创建的基于每一行的数组中,创建另一个数组,并将其分割为“\”符号。

这是我的机会。此代码未进行测试。赶快写吧,但我想你应该有个主意。

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2012-12-10 02:18:21

这里的Length是字符串长度(以字符为单位),而不是您所期望的行数。而且,Dim TotalServers As String = reader.Length没有多大意义;您可能希望使用包含预期服务器成员的类的泛型列表。

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

票数 6
EN

Stack Overflow用户

发布于 2012-12-10 02:15:15

您正在修改循环中的x值。这是通过循环构造来处理的。删除行x += 1

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

代码语言:javascript
复制
' 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应该会导致语法错误。

代码语言:javascript
复制
Dim myArray As String() = reader.Split("|"c)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13794077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档