【问题标题】:VB.Net Returning all lines from a text file that contain a specific stringVB.Net从包含特定字符串的文本文件中返回所有行
【发布时间】:2017-10-07 02:45:29
【问题描述】:

我是编程和 Stack Overflow 的新手,如果有任何我遗漏/未提供的信息,我深表歉意,如果需要,我很乐意对这篇文章进行任何调整。

我正在尝试编写一个应用程序,它查看包含指定字符串的文本文件中的每一行,并将每个匹配的行输出到另一个文本文件。例如,如果我从以下位置搜索包含字符串 'le' 的所有行:

apple
orange
lemon
banana

apple 和 lemon 将被输出到一个单独的文件中。

我的代码只会返回第一个匹配项,然后退出循环,而不寻找其他匹配项。请看下面:

  Using reader As New StreamReader(inputFilePath)
        While Not reader.EndOfStream
            Dim line As String = reader.ReadLine()
            If line.Contains(searchString) Then
                Dim outputFile As System.IO.StreamWriter
                outputFile = My.Computer.FileSystem.OpenTextFileWriter(outputFilePath, True)
                outputFile.WriteLine(line)
                outputFile.Close()
                Exit While
            End If
        End While
    End Using

为什么即使 EndOfStream 条件不满足,代码也会退出 while 循环?

根据上面的例子,我得到的结果是:

apple

不是:

apple
lemon

我知道我没有使用追加来连续添加结果,但是如果这是问题的主要部分,那么我得到的结果肯定是:

lemon

因为 'apple' 会被找到但被第二个结果覆盖。

请任何人提供帮助,再次抱歉打扰任何人,如果问题措辞糟糕或缺乏信息,我特别抱歉,但我将永远感谢任何可以提供帮助的人。这是我的第一个编程项目,我真的很想成功。

顺便说一句,该项目最初是作为一个 powershell 脚本编写的,它运行良好,所以如果任何可以提供帮助的人正在努力破译我的问题,以下代码可以在 PowerShell 中完美运行并给出预期的结果。

$inputFile = Read-Host -Prompt 'Input File- Paste the filename, its 
extension and its path here. Eg- C:\input.log'
$outputFile = Read-Host -Prompt 'Output File- Type the filename its 
extension and its path here. Eg- C:\output.log'
$Pattern = Read-Host -Prompt 'Please paste/type the data to be searched.'

select-string -path $inputFile -Pattern $Pattern | select line | out-file 
$outputFile

再次感谢。

【问题讨论】:

    标签: vb.net powershell text code-translation


    【解决方案1】:

    虽然 Jack Taylor 非常正确,即对现有代码进行小幅更改就可以解决您当前的问题,但您也可以简化代码,使您的原始错误不可能出现:

    File.AppendAllLines(outputFilePath,
                        File.ReadLines(inputFilePath).
                             Where(Function(line) line.Contains(searchString)))
    

    【讨论】:

      【解决方案2】:

      这是由于循环中的 Exit While 行。这将在您的第一场比赛后退出整个循环。如果您只是删除该行,那么它应该可以工作。

      另外,这有点切题,但最好打开输出文件一次,然后在循环后将其关闭,而不是在每次迭代时打开并关闭它。 (如果您没有匹配项,效率会降低,但如果您有多个匹配项,则效率会高很多。)类似以下的方法应该可以解决问题。

      Using reader As New StreamReader(inputFilePath), writer As New StreamWriter(outputFilePath)
          While Not reader.EndOfStream
              Dim line As String = reader.ReadLine()
              If line.Contains(searchString) Then
                  writer.WriteLine(line)
              End If
          End While
      End Using
      

      注意事项:我做过很多编程,但我之前从未使用过 VB.net,并且上面的代码未经测试,所以请谨慎接受这个建议!

      【讨论】:

      • 非常感谢 Jack Taylor 先生。你是一个绅士和一个学者。您的代码第一次完美运行,感谢您指出每次查看循环时都需要打开和关闭流。
      • 将其包装在 using 语句 (StreamWriter) 中,以便对象也被释放。
      • @Zaggler 我已经更新了我的答案 - 你觉得还可以吗?
      • 这是一件小事,但您不必嵌套多个 Using 块,除非您想在两个 Using 语句或两个 End Using 语句之间放置其他代码。否则,一个Using 语句可用于创建多个对象,例如Using reader As New StreamReader(inputFilePath), writer As New StreamWriter(outputFilePath) ... End Using.
      猜你喜欢
      • 2018-06-28
      • 2020-01-03
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 2022-07-19
      相关资源
      最近更新 更多