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