Powershell-在Readline上使用Peek方法是否有好处(虽然不为null)?

时间:2019-12-30 16:36:02

标签: powershell streamreader

我一直在使用PowerShell脚本使用Streamreader(和StreamWriter)将大型文件解析为较小的报表。在寻找将这些东西组合在一起的最佳方法时,我发现有两种方法主要用于将内容读取到文件末尾。

1-while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }

2-{{​​1}}

从文档中看来,Peek将读取下一个值,但不会更改读取器的位置。看起来ReadLine基本上会执行相同的操作,但会读取整个字符串/行。我觉得这是一个“没有问题”的问题-在阅读该行之前偷看一个值真的更有效,还是在将读者分配给变量之前只是一个额外的步骤?

提前谢谢!

1 个答案:

答案 0 :(得分:3)

由于您仍然需要线,我认为没有理由Peek()。如果您真的想检查自己是否结束,那么.EndOfStream property可能会更准确。

As discussed here.Peek()也会在发生错误时返回-1,而不仅仅是到达流的末尾。那里的大多数答案还建议您避免使用它,而只需使用.ReadLine()

mklement0也提到使用System.IO.File.ReadLines。这将返回一个可枚举的对象,因此您可以仅使用路径调用它,并像其他可枚举对象一样使用它,而无需一次加载所有行(因此它仍然适用于大型文件)。

您可以将其与foreachForEach-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 { $_ }