VB.NET - 子字符串函数无法正常工作

问题描述 投票:0回答:1

我的项目中有一个名为

this.txt
的文件。该文件包含绘图的坐标。

文件中的每一行都有 4 个值。每个值之间,有一个字符分隔值。

例如:

109 n 66 m 110 a 67 b

这里,每个值之间有一个字符。

在我的程序中,我使用

this.txt
读取文件
StreamReader

并对行数进行 for 循环。在这个循环中,文本中的每一行我都将其保存在一个数组中。 我在值之间放置字符,以使用

Substring
函数将值放入变量中。

这是我的代码:

Imports System.IO

Public Class Form1
  Dim array2(200) As String
  Dim theLine1 As String
  Dim theLine2 As String
  Dim theLine3 As String
  Dim theLine4 As String

  Private Sub btn_Read_Click(sender As Object, e As EventArgs) Handles btn_Read.Click
      Dim sw2 As New StreamReader("this.txt")
      Dim lineCount = File.ReadAllLines("this.txt").Length
      For t = 0 To lineCount
         array2(t) = sw2.ReadLine
         theLine1 = array2(t).Substring(0, array2(t).IndexOf("n")).Trim()
         theLine2 = array2(t).Substring(array2(t).IndexOf("n") + 1, array2(t).IndexOf("m")).Trim()
         theLine3 = array2(t).Substring(array2(t).IndexOf("m") + 1, array2(t).IndexOf("a")).Trim()
         theLine4 = array2(t).Substring(array2(t).IndexOf("a") + 1, array2(t).IndexOf("b")).Trim()
      Next
  End Sub

End Class

程序直接读取第一个值并将其放入

theLine1
变量中。但是在下一个值中,程序读取了第二个值和第三个值并将其放入
theLine2
变量中。使用前面的示例:
109 n 66 m 110 a 67 b

程序将

66 m 110
放入 theLine2 变量中。我不想要这样,我也不知道为什么会这样。我只想将下一个值放入
theLine2
变量中。

当程序到达

theLine3
变量时也是如此。该程序向我显示错误。

这是错误:

“System.ArgumentOutOfRangeException”类型的未处理异常 发生在 mscorlib.dll 中

附加信息:索引和长度必须引用位置 在字符串内。

arrays string vb.net substring streamreader
1个回答
0
投票

据我了解,您想要逐行提取字母之间的数字。在您的子字符串函数中,您应该将长度指定为第二个参数,表示“我需要查看多远”。但是,号码前面仍然有一个字母。使用

Split
来代替会更容易。

您也不需要

Stream Reader
。由于您没有使用
Using
,您可能会锁定该文件,以防止再次手动打开它。

我将数字变量声明为整数并将它们保留为本地变量。如果您在全球范围内需要它们,请随时将其改回来。

我还添加了检查以确保相应的读取行中始终有内容。

txt 文件中的行:

205 n 92 m 308 a 110 b
76 n 201 m 44 a 89 b
312 n 57 m 102 a 123 b
219 n 68 m 150 a 81 b
Public NotInheritable Class Form1

    Private Sub btn_Read_Click(sender As Object, e As EventArgs) Handles btn_Read.Click
        Dim path As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\new 1.txt"
        If Not System.IO.File.Exists(path) Then
            Return
        End If
        Dim lines As String() = System.IO.File.ReadAllLines(path, System.Text.Encoding.UTF8)
        For i As Integer = 0 To lines.Length - 1 Step 1
            If String.IsNullOrEmpty(lines(i)) Then
                Continue For
            End If

            Dim numbers As String() = lines(i).Split({"n"c, "m"c, "b"c, "a"c, " "c}, StringSplitOptions.RemoveEmptyEntries)
            If numbers.Length < 4 Then
                Continue For
            End If
            Dim firstValue As Integer = Integer.Parse(numbers(0))
            Dim secondValue As Integer = Integer.Parse(numbers(1))
            Dim thirdValue As Integer = Integer.Parse(numbers(2))
            Dim fourthValue As Integer = Integer.Parse(numbers(3))
            Debug.WriteLine(firstValue.ToString() + " " + secondValue.ToString() + " " + thirdValue.ToString() + " " + fourthValue.ToString())
        Next
    End Sub
End Class

结果:

205 92 308 110
76 201 44 89
312 57 102 123
219 68 150 81
© www.soinside.com 2019 - 2024. All rights reserved.