在Scala中解压缩并读取gzip文件

10
在Scala中,如何解压缩包含在file.gz中的文本以便进行处理?我希望将文件内容存储在变量中或保存为本地文件,以便程序可以在之后读取它。具体来说,我正在使用Scalding处理压缩的日志数据,但是Scalding没有定义一种读取FileSource.scala中这些数据的方法。

2
дҪ еҸҜд»ҘдҪҝз”ЁJava java.util.zip.GZipInputStreamд»ҺgzipдёӯжҸҗеҸ–еҶ…е®№пјҢ然еҗҺеҜ№е…¶еҶ…е®№иҝӣиЎҢж“ҚдҪңгҖӮ - 4lex1v
2
使用better-files库,可以通过myFile.newInputStream.gzipped.lines来实现,具体参考https://github.com/pathikrit/better-files/blob/master/README.md。 - Seth Tisue
1个回答

22

这是我的版本:

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.zip.GZIPInputStream
import java.io.FileInputStream

class BufferedReaderIterator(reader: BufferedReader) extends Iterator[String] {
  override def hasNext() = reader.ready
  override def next() = reader.readLine()
}

object GzFileIterator {
  def apply(file: java.io.File, encoding: String) = {
    new BufferedReaderIterator(
      new BufferedReader(
        new InputStreamReader(
          new GZIPInputStream(
            new FileInputStream(file)), encoding)))
  }
}

然后执行:

val iterator = GzFileIterator(new java.io.File("test.txt.gz"), "UTF-8")
iterator.foreach(println)

1
我只是想说我使用了这个解决方案,但是由于reader.ready方法的特性,该解决方案中的BufferedReaderIterator生成了空行。这里有一个正确的在BufferedReader之上实现迭代器的实现 ,我找到了它。 - Yonatan Wilkof
1
出于好奇,文件的哪个方面导致了空行? - dhg
2
在这个帖子中讨论了这个问题:"调用ready()的结果绝对不能告诉你从read()调用中返回的内容,因此不能用它来省略一个null检查。" 我正在使用迭代器从S3存储桶读取.gz文本文件,一些行从迭代器中产生了空对象。然后我改用了我附加的迭代器实现,并停止了遇到这种情况的行为。 - Yonatan Wilkof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接