【问题标题】:Powershell - Is there a benefit to using the Peek method over Readline (while not null)?Powershell - 在 Readline 上使用 Peek 方法有什么好处(而不是 null)?
【发布时间】:2020-04-19 09:18:30
【问题描述】:

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

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

2 - while (($line = $read.ReadLine()) -ne $null) { do stuff ... }

从文档看来,Peek 将读取下一个值,但不会改变读取器的位置。看起来ReadLine 基本上会做同样的事情,但会读取整个字符串/行。我觉得这是一个“不正确”的问题——在读取行之前实际查看一个值是否真的更有效,还是在将读取器分配给变量之前只是一个额外的步骤?

提前谢谢你!

【问题讨论】:

    标签: powershell streamreader


    【解决方案1】:

    既然你无论如何都需要线路,我认为没有理由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 { $_ }
    

    【讨论】:

    • 很好,但请注意,您是否需要检查 $null 以避免在遇到第一行 empty 时退出循环。也许值得一提 System.IO.File.ReadLines 作为更方便的选择。
    • 非常感谢您的反馈。有点话题,我也在和一位同事讨论这个问题,他也提到了$reader = [IO.File]::OpenText('path\to\file') 作为加载文件的一种方法。与.Peek() 方法类似,与[System.IO.File]::ReadLines 相比,它似乎是一个额外的步骤。但是,如果我对this post 的理解正确,那么在包含参数/模式时,它的解析效率可能会更高。
    • @LakeWater 我阅读了您链接的帖子中的问题和答案,但我不确定您对参数/模式的含义。当您不需要它提供的控制时,您自己进行循环迭代和文件句柄操作不会获得太多“效率”。 .ReadLines 为您提供了一种简单的语言结构(可枚举),它高效并能处理所有文件操作。这在可维护性和清晰度方面为您提供了显着优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2010-09-14
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多