在VB.NET中循环遍历文本文件的每一行

3
我有一个包含多行文本的文本文件。
我想循环遍历每一行,直到找到我想要的项目,然后在屏幕上显示它,以标签的形式呈现。
我通过文本框搜索项目。
简单来说,就是:
For i = 0 To number of lines in text file
    If txtsearch.text = row(i).text Then
        lbl1.text = row(i).text
Next i

可能会有多个出现吗?一旦找到,您想要什么,单词还是整行?请提供更多细节... - Trevor
1
抱歉,重新阅读后,它听起来有点含糊不清。我想要该行中的所有文本。该行不会出现多次。 - OmnivorousOctopus
你能添加一个 UI 的截图吗?输入文件的示例是什么?程序输出的示例是什么? - Victor Zakharov
3个回答

5
您可以使用File.ReadLines方法逐行迭代文件。下面是一个简单的示例:
    Dim Term As String = "Your term"
    For Each Line As String In File.ReadLines("Your file path")
        If Line.Contains(Term) = True Then
            ' Do something...Print the line
            Exit For
        End If
    Next

1
一次读取一行的方法是ReadLines,而RealAllLines则是一次性读取所有行。 - Victor Zakharov
@Neolisk,实际上,它们都可以工作。ReadAllLines确实会一次性读取所有行,但我们仍然可以逐行迭代它们。请提供有关您投票反对的原因的其他信息。 - Eminem
1
@Eminem:我通常会选择要么给予评论,要么就是点踩。我的理由是点踩并不能帮助对方改进。但有时候我就是找不到话说,或者那个人太固执和/或傲慢,这时就是点踩的时候了。你说要使用ReadAllLines来逐行迭代。因为迭代不假设流处理,所以会引起混淆。你的帖子可能会被读者误解。StackOverflow经常被视为“真相之源”。现在因为有点像一次只处理一行(即使相反也不是真的),所以真相被扭曲了。 - Victor Zakharov
@Neolisk,Readlines仅在读取时需要,另一方面,ReadAllLines在可以迭代和检查之前被放入数组中。因此,就目前而言,他的答案是好的且更充分的。另外提一下我的答案,File.ReadLines比原始的StreamReader慢一点,但不会显著慢。这是预期的结果,因为File.ReadLines内部只是创建了一个使用StreamReader并在途中进行了一些额外检查的ReadLinesIterator。以下是一些基准测试来确认这些结果:http://cc.davelozinski.com/c-sharp/fastest-way-to-read-text-files - Trevor
1
@MrCoDeXeR:底线是,根据他们的需求,OP可以使用流。上面的答案没有推荐流。因此,我不会点赞。也不会点踩,因为它并没有错,只是效率低下。 - Victor Zakharov

3
这里有一个函数,它会返回包含搜索词的行中的字符串...
  Public Shared Function SearchFile(ByVal strFilePath As String, ByVal strSearchTerm As String) As String
    Dim sr As StreamReader = New StreamReader(strFilePath)
    Dim strLine As String = String.Empty

    Try
        Do While sr.Peek() >= 0
            strLine = String.Empty
            strLine = sr.ReadLine
            If strLine.Contains(strSearchTerm) Then
                sr.Close()
                Exit Do
            End If
        Loop

        Return strLine
    Catch ex As Exception
        Return String.Empty
    End Try
  End Function

要使用该功能,您可以这样做...

 Dim strText As String = SearchFile(FileName, SearchTerm)
 If strText <> String.Empty Then
   Label1.Text = strText
 End If

1
为了与我在其他答案中的建议保持一致,我点赞了你的回答,因为它推荐使用流来保持简单。 - Victor Zakharov
我正在尝试使用这个解决方案处理一个非常类似的问题,但需要在多行CSV中查找整数值(仅限整数值),每行包含两个双精度和一个整数。我已将第二个函数参数更改为 "ByVal intSearchNum As Integer",但它仍然在检测到传递的整数值作为双精度之一时返回 true。因此,包含双精度数值6.67的行被误认为与整数值67匹配,而这并不是我想要的结果。 - nobby

0

循环并从目录中获取所有XML文件,如果我们想要文本文件,请在“* xml”的位置上放置“* .txt”

Dim Directory As New IO.DirectoryInfo(Path)

    Dim allFiles As IO.FileInfo() = Directory.GetFiles("*.xml")
    allFiles = allFiles.OrderByDescending(Function(x) x.FullName).ToArray()
    Dim singleFile As IO.FileInfo


    For Each singleFile In allFiles
        'ds.ReadXml(singleFile)
        xd.Load(singleFile.FullName)

        Dim nodes As XmlNodeList = xd.DocumentElement.SelectNodes("/ORDER/ORDER_HEADER")
        Dim ORDER_NO As String = " "
        For Each node As XmlNode In nodes
            If Not node.SelectSingleNode("ORDER_NO") Is Nothing Then
                ORDER_NO = node.SelectSingleNode("ORDER_NO").InnerText
            End If
        Next

    Next

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接