Powershell - 在 Readline 上使用 Peek 方法是否有好处(虽然不为空)?
Powershell - Is there a benefit to using the Peek method over Readline (while not null)?
我一直在使用 Streamreader(和 StreamWriter)编写 PowerShell 脚本,将大文件解析为较小的报告。在搜索将这些东西放在一起的最佳方法时,我发现有两种主要用于将内容读取到文件末尾的方法。
1 - while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }
2 - while (($line = $read.ReadLine()) -ne $null) { do stuff ... }
从文档来看,Peek will read the next value, but not change the position of the reader. It looks like ReadLine 基本上会做同样的事情,但请阅读整个 string/line。我觉得这是一个 "no-duh" 问题 - 在阅读该行之前实际查看一个值是否真的更有效,或者它只是在将 reader 分配给变量之前的一个额外步骤?
提前致谢!
既然你无论如何都需要台词,我认为没有理由 Peek()
。如果你真的想检查你是否在最后,那么 .EndOfStream
property 可能更准确。
As discussed here、.Peek()
也可以 return -1
当错误发生时,而不仅仅是当到达流的末尾时。那里的大多数答案还建议避免使用它并仅使用 .ReadLine()
。
mklement0 also mentioned using System.IO.File.ReadLines
。这个 return 是一个可枚举的,所以你可以用路径调用它并像其他可枚举一样使用它,而不是一次加载所有行(所以它仍然适用于大文件)。
您可以将它与 foreach
或 ForEach-Object
一起使用,例如:
foreach ($line in ([System.IO.File]::ReadLines('path\to\file'))) {
$line
}
[System.IO.File]::ReadLines('path\to\file') | ForEach-Object -Process {
$_
}
$reader = [System.IO.File]::ReadLines('path\to\file')
foreach ($line in $reader) { $line }
$reader | ForEach-Object -Process { $_ }
我一直在使用 Streamreader(和 StreamWriter)编写 PowerShell 脚本,将大文件解析为较小的报告。在搜索将这些东西放在一起的最佳方法时,我发现有两种主要用于将内容读取到文件末尾的方法。
1 - while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }
2 - while (($line = $read.ReadLine()) -ne $null) { do stuff ... }
从文档来看,Peek will read the next value, but not change the position of the reader. It looks like ReadLine 基本上会做同样的事情,但请阅读整个 string/line。我觉得这是一个 "no-duh" 问题 - 在阅读该行之前实际查看一个值是否真的更有效,或者它只是在将 reader 分配给变量之前的一个额外步骤?
提前致谢!
既然你无论如何都需要台词,我认为没有理由 Peek()
。如果你真的想检查你是否在最后,那么 .EndOfStream
property 可能更准确。
As discussed here、.Peek()
也可以 return -1
当错误发生时,而不仅仅是当到达流的末尾时。那里的大多数答案还建议避免使用它并仅使用 .ReadLine()
。
mklement0 also mentioned using System.IO.File.ReadLines
。这个 return 是一个可枚举的,所以你可以用路径调用它并像其他可枚举一样使用它,而不是一次加载所有行(所以它仍然适用于大文件)。
您可以将它与 foreach
或 ForEach-Object
一起使用,例如:
foreach ($line in ([System.IO.File]::ReadLines('path\to\file'))) {
$line
}
[System.IO.File]::ReadLines('path\to\file') | ForEach-Object -Process {
$_
}
$reader = [System.IO.File]::ReadLines('path\to\file')
foreach ($line in $reader) { $line }
$reader | ForEach-Object -Process { $_ }