Vb.net 在VB 2015中将大型导入文本文件拆分为动态二维数组

Vb.net 在VB 2015中将大型导入文本文件拆分为动态二维数组,vb.net,multidimensional-array,Vb.net,Multidimensional Array,我目前正在尝试编写一种方法来读取一个充满大量数据的文本文件,并创建一个动态2d数组,将每个数值保存在自己的单元格中。文本文件的数据格式如下 150.00 0.00030739 0.00030023 21.498 0.00024092 150.01 0.00030778 0.00030061 21.497 0.00024122 150.02 0.00030818 0.00030100 21.497 0.00024151 150.03 0.00030857 0.00030138 21.496 0.0

我目前正在尝试编写一种方法来读取一个充满大量数据的文本文件,并创建一个动态2d数组,将每个数值保存在自己的单元格中。文本文件的数据格式如下

150.00 0.00030739 0.00030023 21.498 0.00024092

150.01 0.00030778 0.00030061 21.497 0.00024122

150.02 0.00030818 0.00030100 21.497 0.00024151

150.03 0.00030857 0.00030138 21.496 0.00024181

150.04 0.00030896 0.00030177 21.496 0.00024210

150.05 0.00030935 0.00030216 21.496 0.00024239

其中空间由vbTab表示。这就是我目前所拥有的

    Dim strfilename As String
    Dim num_rows As Long
    Dim num_cols As Long
    Dim x As Integer
    Dim y As Integer


    strfilename = "Location of folder holding file" & ListBox1.SelectedItem

    If File.Exists(strfilename) Then
        Dim sReader As StreamReader = File.OpenText(strfilename)
        Dim strLines() As String
        Dim strLine() As String

        'Load content of file to strLines array
        strLines = sReader.ReadToEnd().Split(Environment.NewLine)

        'redimension the array
        num_rows = UBound(strLines)
        strLine = strLines(0).Split(vbTab)
        num_cols = UBound(strLine)
        ReDim sMatrix(num_rows, num_cols)

        'Copy Data into the array
        For x = 0 To num_rows
            strLine = strLines(x).Split(vbTab)
            For y = 0 To num_cols
                sMatrix(x, y) = strLine(y).Trim()
            Next
        Next
    End If
当我运行这段代码时,我只得到数组第一列中的第一个数字,其他所有数字都丢失了。我需要显示所有价值观的东西。任何帮助或指导都将不胜感激

编辑: 这是我看到的一张照片


您不需要一次读取所有数据,您可以逐行读取并处理每一行

我假设数据是机器生成的,以便您知道没有错误。不过,我确实在一行中检查了所需数量的物品

我复制了您提供的数据作为示例,并对其进行了编辑,以将空格更改为选项卡

Option Strict On
Option Infer On

Imports System.IO

Module Module1

    Class Datum
        Property Time As Double
        Property X As Double
        Property Y As Double
        Property Z As Double
        Property A As Double

        Sub New(t As Double, x As Double, y As Double, z As Double, a As Double)
            Me.Time = t
            Me.X = x
            Me.Y = y
            Me.Z = z
            Me.A = z
        End Sub

        Sub New()
            ' empty constructor
        End Sub

        Overrides Function ToString() As String
            Return String.Format("(T={0}, X={1}, Y={2}, Z={3}, A={4}", Time, X, Y, Z, A)
            ' if using VS2015, you can use the following line instead:
            ' Return $"T={Time}, X={X}, Y={Y}, Z={Z}, A={A}"
        End Function

    End Class

    Function LoadData(srcFile As String) As List(Of Datum)
        Dim data = New List(Of Datum)

        Using sr As New StreamReader(srcFile)
            While Not sr.EndOfStream()
                Dim thisLine = sr.ReadLine()
                Dim parts = thisLine.Split({vbTab}, StringSplitOptions.RemoveEmptyEntries)
                If parts.Count = 5 Then
                    data.Add(New Datum(CDbl(parts(0)), CDbl(parts(1)), CDbl(parts(2)), CDbl(parts(3)), CDbl(parts(4))))
                End If
            End While
        End Using

        Return data

    End Function

    Sub Main()
        Dim src = "C:\temp\testdata2.txt"
        Dim myData = LoadData(src)

        For Each datum In myData
            Console.WriteLine(datum.ToString())
        Next

        Console.ReadLine()

    End Sub

End Module
如您所见,如果您使用一个类来保存数据,那么您可以为它提供其他有用的方法,如
.ToString()

确保您不做任何毫无意义的事情,比如尝试将字符串存储在数字数据类型中。强烈建议您将Option Strict On设置为所有项目的默认设置

选项inferon允许编译器在使用类似
Dim k=1.0
的东西时计算出所需的数据类型,因此您不必将
Dim k键入Double=1.0
,但请注意,如果使用
Dim k=1
,它将推断
k
为整数

一旦数据位于列表中某个类的实例中,就可以使用以相当容易阅读的方式处理它,例如

Console.WriteLine("The average X value is " & (myData.Select(Function(d) d.X).Average()).ToString())

这个文件有多大。读取内存中的所有内容不是一个好主意1)除非您有理由将数据保存在数组中,否则最好创建一个类来表示数据,然后创建该类的列表。2) 您可以使用
strLines=File.ReadAllLines(strFilename)
在一个命令中读入数组。3) 如果不使用2),则您忘记了
.Close()
.Dispose()
StreamReader。@Steve-我使用的文本文件大约为700 KB。我不确定这是否会导致性能问题有些事情不像看上去的那样。我已经用一个示例文件测试了您的代码,该文件使用了您的数据并在数字之间添加了正确的制表符分隔符。你的代码可以工作。再次检查数字之间的制表符是否正确,是否有Windows的标准换行符No 700KB应该可以,尽管这取决于许多因素非常感谢您提供的示例。我甚至没想到你能用这种方法。尽管我已经弄清楚了我需要为2d阵列做些什么,但我还是要在我的项目中实现这一点,并通过比较看看它是如何工作的。再次感谢你的帮助。