【问题标题】:I am trying to figure out how to read a text file into an array in vb.net我试图弄清楚如何将文本文件读入 vb.net 中的数组
【发布时间】:2026-01-14 13:40:01
【问题描述】:

我正在尝试在 vb.net(表单)中创建一个程序来处理来自 UVvis 光谱仪的数据。

txt 文件输出如下所示。

“180809_QuartzRefTrans.spc - 原始数据” "波长 nm。","T%" 400.00,90.822 401.00,90.800 402.00,90.823 403.00,90.811 404.00,90.803 405.00,90.804 406.00,90.816 407.00,90.811 408.00,90.833 409.00,90.837 410.00,90.847 411.00,90.827 412.00,90.839 413.00,90.851 414.00,90.828 415.00,90.879 416.00,90.846

等等。

我想要做的是将数据读入一个数组,这样我就可以操作列。我需要能够跳过前两行,以便我拥有的只是数字数据。我还需要它从最低到最高(波长)对数组进行排序。有时我们从 800->200 nm 运行,然后意外进入 200->800 nm

Imports System.IO
Imports System.Windows.Forms.DataVisualization.Charting

Public Class Form1
Public Class RefTrans
    Public Property Wavelength As Double
    Public Property Transpercent As Double
End Class
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim strtext As String

    OpenFileDialog1.Title = "Open Text Files"
    OpenFileDialog1.ShowDialog()

    strtext = OpenFileDialog1.FileName

    TextBox1.Text = My.Computer.FileSystem.GetName(strtext)
    Label1.Text = My.Computer.FileSystem.GetName(strtext)

    Dim line1 As String
    Dim output1 As New ArrayList
    Using sr As New IO.StreamReader(strtext)
        sr.ReadLine()
        sr.ReadLine()
        Do While sr.Peek() >= 0
            line1 = sr.ReadLine()
            output1.Add(line1)
        Loop
    End Using

    If strtext <> "" Then
        Dim SR As New StreamReader(strtext)
        SR.ReadLine()
        Do Until SR.EndOfStream
            TextBox3.Text = TextBox3.Text & SR.ReadLine & vbCrLf

        Loop
        SR.Close()
    End If

    Dim data1 = IO.File.ReadLines(strtext).
    Skip(2).
    Select(Function(line)
               Dim parts = line.Split(","c)

               Return New RefTrans With {.Wavelength = CDbl(parts(0)),
                                         .Transpercent = CDbl(parts(1))}
           End Function).
    ToArray() = line.Split(","c)

End Sub    
End Class

【问题讨论】:

  • 显示您尝试过的代码在哪里?
  • 抱歉,我是 * 的新手,所以我认为我在其中添加了一个额外的步骤。
  • File.ReadAllLines()` 是您真正需要的。避免使用ArrayList,因为它几乎已被弃用
  • 我对 vb.net 很陌生。有没有办法跳过前两行?
  • 将 mylineslist 调暗为新数组

标签: vb.net forms winforms


【解决方案1】:

这是一个示例,它将为您提供Tuple(Of Double, Double) 的数组:

Dim data = IO.File.ReadLines(filePath).
                   Skip(2).
                   Select(Function(line)
                              Dim parts = line.Split(","c)

                              Return Tuple.Create(CDbl(parts(0)), CDbl(parts(1)))
                          End Function).
                   ToArray()

IO.File.ReadLines 方法将读取文件的行。 ReadAllLines 方法读取整个文件,然后将行作为String 数组返回,ReadLines 方法将文件的行公开为可枚举列表,并且这些行仅在您使用它们时从文件中读取.特别是对于大文件,ReadLinesReadAllLines 更有效,因为它确实首先创建了一个您实际上并不想要的中间数组。

Skip 方法允许您访问从特定索引开始的列表中的项目。在读取文件的情况下,无论如何都需要读取每一行,但是在File.ReadLines的结果上调用Skip(2)意味着文件的前两行将在读取后被丢弃,任何后续处理只会在从第三行开始。

Select 方法基本上是一种转换。它说创建一个输出列表,其中包含输入列表中每个项目的项目,其中输出项目是输入项目转换的结果。转换由您提供的函数定义。在这种情况下,文件中的一行是输入,转换是用逗号分割该行,将两个子字符串转换为 Double 值,然后创建一个包含这两个 Double 值的 Tuple

ToArray 方法采用任何可枚举列表,即任何实现 IEnumerable(Of T) 的对象,并返回一个包含该列表中项目的数组。在这种情况下,Select 返回一个 IEnumerable(Of Tuple(Of Double, Double)),所以 ToArray 返回一个 Tuple(Of Double, Double) 数组。

如果你想把这些都写出来,那么它应该是这样的:

'Get all the lines of the file.
Dim step1 As IEnumerable(Of String) = IO.File.ReadLines(filePath)

'Skip the first two lines.
Dim step2 As IEnumerable(Of String) = step1.Skip(2)

'Split each line into two substrings.
Dim step3 As IEnumerable(Of String()) = step2.Select(Function(line) line.Split(","c))

'Convert substrings to numbers and combine.
Dim step4 As IEnumerable(Of Tuple(Of Double, Double)) = step3.Select(Function(parts) Tuple.Create(CDbl(parts(0)), CDbl(parts(1))))

'Create an array of Tuples.
Dim data As Tuple(Of Double, Double)() = step4.ToArray()

Tuple 基本上是用于将值组合在一起的通用对象。您可以将Tuple 用于一次性案例,而不是定义自己的类。不过,您可能更喜欢在所有情况下定义自己的类,并且您应该定义自己的类,您将在其中广泛使用数据。在这种情况下,您自己的类可能如下所示:

Public Class RefTrans
    Public Property Wavelength As Double
    Public Property TransPercent As Double
End Class

然后代码将变为:

Dim data = IO.File.ReadLines(filePath).
                   Skip(2).
                   Select(Function(line)
                              Dim parts = line.Split(","c)

                              Return New RefTrans With {.Wavelength = CDbl(parts(0)),
                                                        .TransPercent = CDbl(parts(1))}
                          End Function).
                   ToArray()

在这种情况下,数组的每个元素都有 WavelengthTransPercent 属性。如果您使用Tuples,则属性具有通用名称Item1Item2

一旦你有了数组,你就可以使用Array.Sort的任何合适的重载来进行排序,例如

Array.Sort(data, Function(d1, d2) d1.Item1.CompareTo(d2.Item1))

这将通过比较包含波长值的Item1 属性对Tuples 进行排序。如果您使用自己的课程,那么显然您指定了自己的属性,例如我展示了RefTrans 类中的Wavelength 属性。

【讨论】:

  • 这不是答案,这是一篇博客文章,哈哈。很棒的全面答案!
  • 优秀的答案。
  • 对不起,我把它加到帖子里了。
  • @CWatts 你确实包含了代码,但你没有说它有什么问题!此外,您不必包含所有内容,只需包含相关部分以及错误(如果有)。
  • 我无法让 openfiledialog 与 Dim data = IO.File.ReadLines(openfiledialog.FileName) 一起使用。我正在尝试将它放到可以使用 openfiledialog 选择我的 txt 文件然后使用 readlines 提取数组的位置