我目前正在尝试编写一种方法来读取填充了大量数据的文本文件,并创建一个动态的二维数组来将每个数值保存在自己的单元格中。文本文件的数据格式如下
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
当我运行此代码时,我只获得数组第一列中的第一个数字,而其他所有内容都丢失了。我需要展示所有价值观的东西。任何帮助或指导将不胜感激
编辑: 这是我所看到的图片。
答案 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())