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

时间:2016-01-13 18:38:35

标签: vb.net multidimensional-array

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

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

当我运行此代码时,我只获得数组第一列中的第一个数字,而其他所有内容都丢失了。我需要展示所有价值观的东西。任何帮助或指导将不胜感激

编辑: 这是我所看到的图片。

What I'm Seeing

1 个答案:

答案 0 :(得分:0)

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

我认为数据是由机器生成的,因此您知道没有错误。然而,我确实在一条线上检查了所需数量的物品。

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

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确保您不会执行任何无意义的操作,例如尝试将字符串存储在数字数据类型中。强烈建议您将Option Strict On设置为所有项目的默认值。

Option Infer On允许编译器在您使用Dim k = 1.0之类的内容时找出您想要的数据类型,因此您不必键入Dim k As Double = 1.0,但请注意,如果您使用Dim k = 1 {1}}它会将k推断为整数。

一旦数据在列表中的类的实例中,您可以使用LINQ以相当容易阅读的方式处理它,例如,您可以

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