Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Visual Basic将文件加载到由制表符分隔的字符串(,)_String_Vb.net_File - Fatal编程技术网

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