Go:读取zip文件中的行块

时间:2017-10-26 06:39:42

标签: go zip

我需要尽可能快地读取zip文件中的n行。

我在Go开始了。对于bash爱好者,我想做同样的事情(在199500和200000行之间获得500行):

time query=$(zcat fake_contacts_200k.zip | sed '199500,200000!d')

real    0m0.106s
user    0m0.119s
sys 0m0.013s

欢迎任何想法。

1 个答案:

答案 0 :(得分:2)

  1. 导入archive/zip

  2. 打开并阅读存档文件 as shown in the example right there in the docs

    • 请注意,为了模仿您必须的zcat行为 首先检查File的{​​{1}}字段的长度 通过调用zip.ReadCloser返回的实例, 如果它不等于1则失败 - 也就是说,没有文件 存档或其中有两个或多个文件¹。

    • 请注意,您必须检查错误值 通过致电zip.OpenReader返回,等同于zip.OpenReader, 如果它相等,你必须:

      • 关闭返回的zip.ErrFormat
      • 尝试将文件重新解释为zip.ReadCloser - 已格式化(步骤4)。
  3. 选择第一个(和唯一的)gzip成员 在其上拨打Open

    然后,您可以从返回的File

    中读取文件的内容

    阅读后,您需要在该实例上调用io.ReaderCloser然后 关闭zip文件。就这样。 ∎

  4. 如果步骤(2)失败,因为文件没有zip格式, 你要测试它是否是gzip格式化的。

    为了做到这一点,你基本上使用相同的步骤 compress/gzip包。

    请注意,与zip格式相反,gzip不提供文件存档 - 它只是一个压缩器,因此gzip流中的任何文件都没有元信息,只有压缩数据。 (这个事实由于包名称的不同而加以强调。)

    如果尝试打开与gzip存档相同的文件,则返回 Close()错误,你拯救,否则你读取数据 之后你关闭了读者。就这样。 ∎

  5. 要处理解压缩文件中的特定行, 你需要

    1. 在第一个处理之前略过一行。
    2. 处理这些行,直到并包括最后一行来处理。
    3. 停止处理。
    4. 解释从gzip.ErrHeaderio.Reader读取的数据, 最好使用bufio.Scanner - 看那里的“例子(行)”。

      P.S。

      请仔细阅读this essay 试着让你的下一个问题更好。

      ¹您也可以阅读所有文件并解释其内容 作为一个连续的流 - 会偏离io.ReadCloser的行为 但那可能会更好。这实际上取决于您的数据。