逐行处理 HereString

Process HereString line by line

我想定义一个 HereString 然后逐行使用它。最初我认为这些行在 HereString 中是天生的,所以我可以 foreach ($line in $hereString),当它不起作用时我尝试了 Get-Content $hereString。在这两种情况下都没有快乐。 目标只是处理一些最终将操纵整个文本文件的代码,因此我可以在实现它的同时快速转换为使用一个小的示例文本文件,但现在我很好奇 HereStrings 是否可以逐行使用, 没有以某种方式分裂。

你可以这样做:

foreach ( $line in $herestring.replace("`r`n", "`n").split("`n") ) { 
    '>>>{0}<<<' -f $line; 
    }

replace() 在那里用新行替换 Windows' CRLF 行终止符...

作为, the simplest solution is probably using the -split operator:

foreach($line in $herestring -split '\r?\n')
{
    # process $line here    
}

使用模式 \r?\n 将同时匹配 \r\n(Windows-style 换行符)和 \n(Unix-style 换行符)

由于您的意图是使用它来处理文件,因此我将从以下内容开始:

$file = 'c:\testfiles\testfile1.txt'

$textdata = 
@'
Line1
Line2
Line3
'@

$textdata | Set-Content $file

$lines = Get-Content $file

foreach ($line in $lines) {}

现在您将在与生产环境相同的环境中进行测试,并且可以试验不同的 I/O 方法以及不同的数据解析和操作方法。随着所涉及文件的大小和数量的增加,从性能的角度来看,了解如何执行此操作将变得更加重要。

请注意,'Split' 和 'ForEach' 都会导致在处理开始之前首先解析整个文件。如果文件非常大,处理开始前会有延迟,内存可能成为问题。

另一种选择来自 .NET 的文本阅读器形式...

$rdr = new-object System.IO.StreamReader('c:\path\to\file.txt')
while (!$rdr.EndOfStream) {
    $line = $rdr.ReadLine()
    ## do processing on the line ##

}

在上面,每次调用 StreamReader 的 ReadLine 方法时,都会前进到下一行。 以上是最有效的,如果在文件中发现不喜欢的内容,让您有机会提前突破。

你可以看看StreamReader here的详情。