我有许多文件,大小各异。但是我想对所有这些都完成相同的事情,然后将它们加载到string(,)中。
在过去的几个小时中,我搜索了许多与此类似的代码,但似乎有一些小的变化,但是即使这样,我最多也只能加载一行:
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
这是我的文件的一个示例(只有它们很大):
aaa fff 0
bbb ggg 1
ccc hhh 2
ddd iii 3
eee jjj 4
这基本上就是我希望以上内容从外部文本文件加载到我的数组中的方式:
Dim strexample As String(,) = {{"aaa", "fff", "0"},
{"bbb", "ggg", "1"},
{"ccc", "hhh", "2"},
{"ddd", "iii", "3"},
{"eee", "jjj", "4"}}
我什至尝试将所有表作为string(,)手动添加到VB。那行得通...但是像这样手动输入时,文件大小会增加到〜30mb,并给我带来了巨大的性能冲击。不太理想。
我的问题是,如何从文本文件加载到类似于上面的上一个示例的string(,)中?
非常感谢您。
答案 0 :(得分:3)
strimportsplit = strimport(i).Split(New Char() {vbTab}) 'This line doesn't work
它不起作用,因为您每次都更改strimportsplit
的值。您不会像您可能正在想的那样添加更多“行”。
如果您真的要使用2D数组,则需要知道两个尺寸的长度,否则需要进行一些转换。您可以通过执行以下操作来计算长度并创建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
)。
但是,更好的方法是使用锯齿数组而不是2D数组。您可以使用Linq编写简单的代码来实现这一点:
Dim myJaggedArray As String()() = File.ReadAllLines(filePath).
Select(Function(l) l.Split(vbTab)).ToArray
锯齿状数组是数组的数组(在您的情况下为字符串数组的数组),您可以使用arr(x)(y)
而不是arr(x, y)
来访问其值。
处理这种情况的另一种方法是使用任何与定界文件(逗号分隔,制表符分隔等)一起使用的现有库,而不必自己处理。我建议使用GenericParser,您可以轻松地使用它来将定界文件中的数据加载到DataTable
中。您可以检查my answer to another question以获得有关如何使用它的更多信息。
答案 1 :(得分:2)
如果您切换到Jagged Array而不是二维图片,这会更容易。二维数组的问题在于,您一次只能访问和修改一个元素,而带有锯齿形数组的您只能访问整行。
锯齿状数组本质上是数组数组,可以声明为:
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开始,所以最后一项将具有索引Length - 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".
答案 2 :(得分:2)
我将使用String()列表,而不是使用锯齿数组。这是对您的代码进行一些修改以说明问题。
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