VB.Net返回包含特定字符串

时间:2017-05-08 23:38:19

标签: vb.net powershell text code-translation

我是编程和Stack Overflow的新手,如果有任何我错过/未提供的信息,我很乐意,如果需要,我很乐意对此帖做任何调整。

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

apple
orange
lemon
banana

苹果和柠檬将输出到单独的文件中。

我所拥有的代码只返回第一个匹配,然后退出循环,而不查找其他匹配项。请参阅以下内容:

  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

再次感谢。

2 个答案:

答案 0 :(得分: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,上面的代码是未经测试的,所以请大家不要接受这个建议!

答案 1 :(得分:2)

虽然Jack Taylor非常正确,对现有代码进行一些小改动可以解决您的问题,但您也可以简化代码,以免造成原始错误:

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