逐行处理 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的详情。
我想定义一个 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 行终止符...
作为-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的详情。