我一直在使用PowerShell脚本使用Streamreader(和StreamWriter)将大型文件解析为较小的报表。在寻找将这些东西组合在一起的最佳方法时,我发现有两种方法主要用于将内容读取到文件末尾。
1-while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }
2-{{1}}
从文档中看来,Peek将读取下一个值,但不会更改读取器的位置。看起来ReadLine基本上会执行相同的操作,但会读取整个字符串/行。我觉得这是一个“没有问题”的问题-在阅读该行之前偷看一个值真的更有效,还是在将读者分配给变量之前只是一个额外的步骤?
提前谢谢!
答案 0 :(得分:3)
由于您仍然需要线,我认为没有理由Peek()
。如果您真的想检查自己是否结束,那么.EndOfStream
property可能会更准确。
As discussed here,.Peek()
也会在发生错误时返回-1
,而不仅仅是到达流的末尾。那里的大多数答案还建议您避免使用它,而只需使用.ReadLine()
。
mklement0也提到使用System.IO.File.ReadLines
。这将返回一个可枚举的对象,因此您可以仅使用路径调用它,并像其他可枚举对象一样使用它,而无需一次加载所有行(因此它仍然适用于大型文件)。
您可以将其与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 { $_ }