Vb.net 在VB 2015中将大型导入文本文件拆分为动态二维数组
我目前正在尝试编写一种方法来读取一个充满大量数据的文本文件,并创建一个动态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表示。这就是我目前所拥有的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
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阵列做些什么,但我还是要在我的项目中实现这一点,并通过比较看看它是如何工作的。再次感谢你的帮助。