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