String Visual Basic将文件加载到由制表符分隔的字符串(,)
我有很多不同大小的文件。但是我想用它们完成同样的事情,将它们加载到一个字符串(,)中 在过去的几个小时里,我搜索了许多类似于此的代码变体,似乎有一些小改动,但即使如此,我最多只能加载一行:String Visual Basic将文件加载到由制表符分隔的字符串(,),string,vb.net,file,String,Vb.net,File,我有很多不同大小的文件。但是我想用它们完成同样的事情,将它们加载到一个字符串(,)中 在过去的几个小时里,我搜索了许多类似于此的代码变体,似乎有一些小改动,但即使如此,我最多只能加载一行: Dim strimport As String() = {} Dim strimportsplit As String(,) = {} Dim i As Integer = 0 strimport = File.ReadAllLines("C:\test.txt")
Dim strimport As String() = {}
Dim strimportsplit As String(,) = {}
Dim i As Integer = 0
strimport = File.ReadAllLines("C:\test.txt")
For i = 0 To strimport.Length - 1
strimportsplit = strimport(i).Split(New Char() {vbTab}) 'This line doesn't work
Next
这是我的文件的一个示例(只是它们要大得多):
这就是我希望从外部文本文件将上述内容加载到数组中的基本方式:
Dim strexample As String(,) = {{"aaa", "fff", "0"},
{"bbb", "ggg", "1"},
{"ccc", "hhh", "2"},
{"ddd", "iii", "3"},
{"eee", "jjj", "4"}}
我甚至尝试将我所有的表作为字符串(,)手动添加到VB中。这很有效。。。但是像这样手动输入它会将文件大小提升到~30mb,并给我带来巨大的性能损失。不太理想
我的问题是,如何将文本文件加载到类似于上面最后一个示例的字符串(,)中
提前非常感谢。如果您切换到二维而不是二维,这将更容易。二维数组(此处)的问题是,一次只能访问和修改一个元素,而锯齿数组可以访问整行 锯齿数组本质上是一个数组数组,可以这样声明:
Dim strimportsplit As String()()
您必须将其行大小设置为strimport.Length
,以确保它可以容纳相同数量的行:
Dim strimport As String()
Dim strimportsplit As String()()
'Dim i As Integer = 0 -- No need for this, it's declared by the loop.
strimport = File.ReadAllLines("C:\test.txt")
strimportsplit = New String(strimport.Length - 1)() {}
注意:我之所以使用上面的strimport.Length-1
,是因为在VB.NET中,您实际上在声明新数组时不指定长度,而是指定最后一项的索引。由于索引从0开始,最后一项的索引长度为-1
然后在循环中,您只需使用i
引用当前项目数组(行/行):
strimportsplit(i) = strimport(i).Split(New Char() {vbTab})
访问项目可以这样做:
'strimportsplit(row)(column)
MessageBox.Show(strimportsplit(0)(1)) 'Displays "fff".
MessageBox.Show(strimportsplit(3)(2)) 'Displays "3".
如果愿意,还可以访问整行:
Dim ThirdRow As String() = strimportsplit(2)
MessageBox.Show(ThirdRow(0)) 'Displays "ccc".
它不起作用,因为您每次都更改strimportsplit
的值。您不会像您可能认为正在发生的那样向它添加更多的“行”
如果你真的想使用2D数组,你需要知道两个维度的长度,或者你需要在之后进行一些转换。通过执行以下操作,可以计算长度并创建二维阵列:
Dim lines As String() = File.ReadAllLines(filePath)
Dim height As Integer = lines.Count - 1
' Calculating the max. number of "columns" in case they vary.
Dim width As Integer = lines.Select(Function(l) l.Split(vbTab).Count).Max - 1
Dim my2DArray(height, width) As String
For i = 0 To lines.Count - 1
Dim columns As String() = lines(i).Split(vbTab)
For j = 0 To columns.Count - 1
my2DArray(i, j) = columns(j)
Next
Next
请注意,如果行的“列”数不相同,则数组中的某些项将等于null(或Nothing
)
但是,更好的方法是使用锯齿阵列而不是二维阵列。使用Linq可以通过编写以下简单的内容来实现:
Dim myJaggedArray As String()() = File.ReadAllLines(filePath).
Select(Function(l) l.Split(vbTab)).ToArray
锯齿数组是数组的数组(在您的例子中是字符串数组的数组),您可以使用arr(x)(y)
而不是arr(x,y)
来访问其值
处理这种情况的另一种方法是使用任何现有的用于分隔文件(逗号分隔、制表符分隔等)的库,而不必自己处理。我建议使用它,您可以轻松地使用它将数据从分隔文件加载到
数据表中。您可以查看有关如何使用它的更多信息。我将使用字符串()列表,而不是使用锯齿状数组。下面是您的代码稍微修改后的示例
Dim strimport() As String
strimport = IO.File.ReadAllLines("C:\test.txt")
Dim StrImportSplit As New List(Of String())
For Each ln As String In strimport 'iterate lines in file
StrImportSplit.Add(ln.Split(New Char() {ControlChars.Tab}))
Next
还有一张支票
'check
For lidx As Integer = 0 To StrImportSplit.Count - 1 'rows
Dim l As New System.Text.StringBuilder
For cidx As Integer = 0 To StrImportSplit(lidx).Length - 1 'columns
l.Append(StrImportSplit(lidx)(cidx))
l.Append(" ")
Next
Debug.WriteLine(l)
Next
不要自己编写此代码,请使用专用的。并确保使用更好的收集类型来存储数据,而不是数组。List(Of T)类擅长动态调整大小。
Dim strimport() As String
strimport = IO.File.ReadAllLines("C:\test.txt")
Dim StrImportSplit As New List(Of String())
For Each ln As String In strimport 'iterate lines in file
StrImportSplit.Add(ln.Split(New Char() {ControlChars.Tab}))
Next
'check
For lidx As Integer = 0 To StrImportSplit.Count - 1 'rows
Dim l As New System.Text.StringBuilder
For cidx As Integer = 0 To StrImportSplit(lidx).Length - 1 'columns
l.Append(StrImportSplit(lidx)(cidx))
l.Append(" ")
Next
Debug.WriteLine(l)
Next