Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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
VB.net从以开头的文本文件中读取特定行,并在以开头时停止读取_Vb.net_Datagridview_Text Files_File.readalllines - Fatal编程技术网

VB.net从以开头的文本文件中读取特定行,并在以开头时停止读取

VB.net从以开头的文本文件中读取特定行,并在以开头时停止读取,vb.net,datagridview,text-files,file.readalllines,Vb.net,Datagridview,Text Files,File.readalllines,我希望从文本文件中读取以某些字符开头的行,并在该行以其他字符开头时停止。因此,在我的示例中,我希望从AB行开始读取,并在EF行停止,但并非所有行都包含CD行。始终会有AB线和EF线,但其间的线数未知 下面是一个我将要阅读的文本文件中的行的示例。您可以看到,这将在DataGridView中创建两行,但是第一行缺少CD行,应该为空 AB-id1 EF-address1 AB-id2 CD-name1 EF-address2 以下是我目前掌握的代码: Dim lines() As String

我希望从文本文件中读取以某些字符开头的行,并在该行以其他字符开头时停止。因此,在我的示例中,我希望从AB行开始读取,并在EF行停止,但并非所有行都包含CD行。始终会有AB线和EF线,但其间的线数未知

下面是一个我将要阅读的文本文件中的行的示例。您可以看到,这将在DataGridView中创建两行,但是第一行缺少CD行,应该为空

AB-id1
EF-address1
AB-id2
CD-name1
EF-address2
以下是我目前掌握的代码:

  Dim lines() As String = File.ReadAllLines(textfile)
    For i As Integer = 0 To lines.Length - 1
            If lines(i).StartsWith("AB") Then
            Dim nextLines As String() = lines.Skip(i + 1).ToArray
            
            Dim info As String = nextLines.FirstOrDefault(Function(Line) Line.StartsWith("CD"))
            Dim name As String = "Yes"
            
            Dim info2 As String = nextLines.FirstOrDefault(Function(Line) Line.StartsWith("EF"))
            Dim address As String = "Yes"
            End If

            DataGridView.Rows.Add(name,address)
    Next 
现在,我当前得到的输出是:

|Yes|Yes|
|Yes|Yes|
我应该得到:

||Yes|
|Yes|Yes|
看起来它读取的文本文件太深了,我需要它在EF停止读取。我试过做一段时间,一直做到最后都没有成功。有什么建议吗?

您可以使用该函数获取以前缀开头的下一行的索引。这样,您就不必每次跳过行并创建一个新数组

请尝试以下方法:

Dim lines() As String = File.ReadAllLines(textFile)
For i As Integer = 0 To lines.Length - 1
    If lines(i).StartsWith("AB") Then
        Dim addressIndex As Integer = Array.FindIndex(lines, i + 1, Function(Line) Line.StartsWith("EF"))
        Dim address As String = If(addressIndex <> -1, lines(addressIndex).Substring(3), "") ' Get everything past the "-"

        Dim name As String = ""
        If addressIndex <> -1 Then
            Dim nameIndex As Integer = Array.FindIndex(lines, i + 1, addressIndex - i, Function(line) line.StartsWith("CD"))
            If nameIndex <> -1 Then
                name = lines(nameIndex).Substring(3) ' Get everything past the "-"
            End If
        End If

        DataGridView.Rows.Add(name, address)
    End If
Next
Dim lines()作为String=File.ReadAllLines(textFile)
对于i,整数=0到行。长度-1
如果第(i)行以(“AB”)开头,则
Dim addressIndex作为整数=数组.FindIndex(行,i+1,函数(行)行,带(“EF”)的StartsWith)
Dim address As String=If(addressIndex-1,行(addressIndex)。子字符串(3),“”)使所有内容都超过“-”
Dim name As String=“”
如果地址索引为-1,则
Dim nameIndex作为整数=数组.FindIndex(行,i+1,addressIndex-i,函数(行)行,带(“CD”)的StartsWith)
如果名称索引为-1,则
name=行(nameIndex)。子字符串(3)“让所有内容都通过“-”
如果结束
如果结束
DataGridView.Rows.Add(名称、地址)
如果结束
下一个

我仍然有同样的问题。如果行CD不存在,它只复制它看到的第一张CD中的数据。如果您使用我的示例数据,那么这个名称1将出现两次。啊…所以我们需要先搜索“EF”,然后使用重载,让您在搜索“CD”后给出开始/停止。将更新代码。是的,基本上我想在以AB开头的每一行开始搜索,并在EF行停止搜索。