我需要尽可能快地读取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
欢迎任何想法。
答案 0 :(得分:2)
导入archive/zip
。
打开并阅读存档文件 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)。选择第一个(和唯一的)gzip
成员
在其上拨打Open
。
然后,您可以从返回的File
。
阅读后,您需要在该实例上调用io.ReaderCloser
然后
关闭zip文件。就这样。 ∎
如果步骤(2)失败,因为文件没有zip格式, 你要测试它是否是gzip格式化的。
为了做到这一点,你基本上使用相同的步骤
compress/gzip
包。
请注意,与zip格式相反,gzip不提供文件存档 - 它只是一个压缩器,因此gzip流中的任何文件都没有元信息,只有压缩数据。 (这个事实由于包名称的不同而加以强调。)
如果尝试打开与gzip存档相同的文件,则返回
Close()
错误,你拯救,否则你读取数据
之后你关闭了读者。就这样。 ∎
要处理解压缩文件中的特定行, 你需要
解释从gzip.ErrHeader
或io.Reader
读取的数据,
最好使用bufio.Scanner
-
看那里的“例子(行)”。
P.S。
请仔细阅读this essay 试着让你的下一个问题更好。
¹您也可以阅读所有文件并解释其内容
作为一个连续的流 - 会偏离io.ReadCloser
的行为
但那可能会更好。这实际上取决于您的数据。