逐行处理HereString

时间:2017-01-21 10:57:31

标签: powershell herestring

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

4 个答案:

答案 0 :(得分:2)

你可以这样做:

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

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

答案 1 :(得分:2)

作为PetSerAl suggests,最简单的解决方案可能是使用-split operator

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

使用模式\r?\n将匹配\r\n(Windows样式换行符)和\n(Unix样式换行符)

答案 2 :(得分:0)

由于您的意图是使用它来处理文件,我从这样的事情开始:

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

$textdata = 
@'
Line1
Line2
Line3
'@

$textdata | Set-Content $file

$lines = Get-Content $file

foreach ($line in $lines) {}

现在,您将在与生产相关的环境中进行测试,并且可以尝试不同的I / O方法以及不同的数据解析和操作方法。从性能的角度来看,知道如何做到这一点将变得更加重要,因为涉及的文件的大小和数量向上扩展。

答案 3 :(得分:0)

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

另一种替代方案来自.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

的详细信息