我一直在使用Streamreader(和StreamWriter(的PowerShell脚本上,将大文件解析为较小的报告。在搜索将这个东西放在一起的最佳方式时,我发现有两种方法主要用于将内容读取到文件末尾。
1 -while ($reader.Peek() -ge 0) { $line = $reader.Readline() ... }
2 -while (($line = $read.ReadLine()) -ne $null) { do stuff ... }
从文档中看,Peek 似乎将读取下一个值,但不会更改读取器的位置。看起来 ReadLine 基本上也会做同样的事情,但会读取整个字符串/行。我觉得这是一个"no-duh"问题 - 在阅读行之前实际查看值真的更有效,还是只是将读者分配给变量之前的额外步骤?
提前谢谢你!
既然你无论如何都需要台词,我认为没有理由Peek()
.如果你真的想检查你是否在最后,那么无论如何.EndOfStream
属性可能会更准确。
如此处所述,.Peek()
也可以在发生错误时返回-1
,而不仅仅是在到达流的末尾时返回。那里的大多数答案还建议避免使用它,只使用.ReadLine()
.
mklement0 还提到使用System.IO.File.ReadLines
.这将返回一个枚举,因此您可以使用路径调用它并像其他枚举一样使用它,而无需一次加载所有行(因此它仍然适用于大文件(。
您可以将其与foreach
或ForEach-Object
一起使用,例如:
foreach ($line in ([System.IO.File]::ReadLines('pathtofile'))) {
$line
}
[System.IO.File]::ReadLines('pathtofile') | ForEach-Object -Process {
$_
}
$reader = [System.IO.File]::ReadLines('pathtofile')
foreach ($line in $reader) { $line }
$reader | ForEach-Object -Process { $_ }