0

我的记事本文件中有以下输入行。

示例 1:

//UNION TEXT=firststring,FRIEND='ABC,Secondstring,ABAER'

示例 2:

//UNION TEXT=firststring,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
//            FRIEND='ABC,SecondString,ABAER'

基本上,一行可以跨越两到三行。如果是最后一个字符,,则将其视为连续字符。

在示例 1 中 - 文本在一行中。在示例 2 中 - 相同的文本在两行中。

在示例 1 中,我可能可以编写以下代码。但是,如果“输入文本”基于连续字符跨越两三行,我不知道该怎么做,

$result = Get-Content $file.fullName | ? { ($_ -match firststring) -and ($_ -match 'secondstring')}

我想我需要一种方法,以便我可以在具有“-and”条件的多行中搜索文本。类似的东西...

谢谢!

4

3 回答 3

1

您可以阅读文件的全部内容,加入连续的行,然后逐行拆分文本:

$text = [System.IO.File]::ReadAllText("C:\path\to\your.txt")
$text -replace ",`r`n", "," -split "`r`n" | ...
于 2013-06-16T14:47:39.200 回答
0
# get the full content as one String
$content = Get-Content -Path $file.fullName -Raw
# join continued lines, split content and filter
$content -replace '(?<=,)\s*' -split '\r\n' -match 'firststring.+secondstring'
于 2013-06-16T15:37:27.510 回答
0

如果文件很大并且您想避免将整个文件加载到内存中,您可能需要使用良好的旧 .NET ReadLine:

$reader = [System.IO.File]::OpenText("test.txt")
try {
    $sb = New-Object -TypeName "System.Text.StringBuilder";

    for(;;) {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }

        if ($line.EndsWith(','))
        {
            [void]$sb.Append($line)
        }
        else
        {
            [void]$sb.Append($line)
            # You have full line at this point.
            # Call string match or whatever you find appropriate.
            $fullLine = $sb.ToString()
            Write-Host $fullLine
            [void]$sb.Clear()
        }
    }
}
finally {
    $reader.Close()
}

如果文件不大(假设 < 1G),Ansgar Wiechers 的答案应该可以解决问题。

于 2013-06-16T18:33:41.660 回答