1

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

4

4 回答 4

2

正如PetSerAl 建议的那样,最简单的解决方案可能是使用-split运算符

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

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

于 2017-01-21T11:54:09.907 回答
2

你可以这样做:

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

replace()只是用一个新行替换 Windows 的 CRLF 行终止符......

于 2017-01-21T11:43:42.743 回答
0

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

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

$textdata = 
@'
Line1
Line2
Line3
'@

$textdata | Set-Content $file

$lines = Get-Content $file

foreach ($line in $lines) {}

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

于 2017-01-21T13:01:13.633 回答
0

请注意,“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的详细信息。

于 2017-01-22T02:07:40.327 回答