【问题标题】:Get the first n characters of a large file with PowerShell使用 PowerShell 获取大文件的前 n 个字符
【发布时间】:2013-09-21 17:29:34
【问题描述】:

我有一个巨大的 XML 文件 (0.5 GB),没有换行符。我希望能够在不打开整个文件的情况下查看前 200 个字符。有没有办法用 PowerShell 做到这一点?

【问题讨论】:

  • 在我看来 get-content 将有效地加载整个文件,所以这不是我想要的 - 除非 gc 中有一些我找不到的懒惰评估魔法的文档。
  • This answer to stackoverflow.com/questions/1001776/…可以作为依据。如果要提取的片段很大,它可能比下面的this answer 工作得更快。这是我从非系统测试中得出的结论。试试你认为合适的。

标签: powershell


【解决方案1】:

PowerShell 桌面(最高 5.1)

您可以使用 Get-Content 在字节级别读取,如下所示:

$bytes = Get-Content .\files.txt -Encoding byte -TotalCount 200
[System.Text.Encoding]::Unicode.GetString($bytes)

如果日志文件是 ASCII,您可以将其简化为:

[char[]](Get-Content .\files.txt -Encoding byte -TotalCount 200)

PowerShell Core 6.0 及更新版本

PowerShell Core 不支持byte 编码。已被-AsByteStream 参数取代。

$bytes = Get-Content .\file.txt -AsByteStream -TotalCount 200
[System.Text.Encoding]::Unicode.GetString($bytes)

【讨论】:

  • 该文件是 ASCII,最有效的是您的第一个答案的 ascii 版本。第二个答案实际上显示为每个字符一行 - 有点难以阅读!
  • 如果你在整个东西周围加上一个 () 并且 -join '' 它将再次变成一个字符串。
  • @Eris 是的,这将使它恢复为字符串形式,但整个事物周围的“()”位不是必需的。
  • 这对我很有用。而且不会像get-content那样遍历整个文件,所以对于大文件最方便。
【解决方案2】:

通过powershell commandlets 复制二进制文件会有点慢。但是,您可以从 powershell 运行以下命令以获得不错的性能:

cmd /c copy /b "large file.ext" "first n.ext"
FSUTIL file seteof "first n.ext" $nbytes

在 Win 10 PS 5.1 中测试
结果:4 秒内处理了 1.43GB

【讨论】:

    【解决方案3】:

    Get-Content 采用 -ReadCount 选项,因此您只能采用前 X 行。

    如果您真的想要字符粒度,则需要使用 .NET 中的 [IO.File]::Read 方法之一

    【讨论】:

    • 很遗憾,文件中没有换行符,所以这不是一个选项
    【解决方案4】:

    (get-content myfile).Substring(0,x)

    其中 x 是您希望从每行中获取的字符数,例如 $lines = (get-content myfile).Substring(0,10) 将返回一个字符串数组,其中数组的每个成员都包含 myfile 中每一行的前 10 个字符。

    【讨论】:

    • 欢迎堆栈溢出。请考虑以不同于文本的方式格式化您的代码。你可以使用``来包装你的代码
    • 这没有回答原始问题,他们想要整个文件的前 X 个字节,而不是每行。对于作为原始问题一部分的大文件,这种方法也非常低效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2020-11-17
    • 2013-01-28
    • 2021-02-11
    相关资源
    最近更新 更多