【问题标题】:uncompress and read gzip file in scala在 scala 中解压并读取 gzip 文件
【发布时间】:2013-07-02 22:00:45
【问题描述】:

在 Scala 中,如何解压缩 file.gz 中包含的文本以便对其进行处理?我很乐意将文件的内容存储在变量中,或者将其保存为本地文件,以便之后程序可以读取它。

具体来说,我是使用 Scalding 来处理压缩的日志数据,但是 Scalding 并没有在FileSource.scala 中定义读取它们的方式。

【问题讨论】:

标签: scala gzip scalding


【解决方案1】:

这是我的版本:

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)

【讨论】:

  • 只是想说我使用了这个解决方案,但是由于 reader.ready 方法的性质,这个解决方案中的 BufferedReaderIterator 产生了空行。这是我找到的正确的implementation of an iterator on top of a BufferedReader
  • 出于好奇,文件的哪些方面导致了空行?
  • post 中进行了讨论:“...调用 ready() 的结果绝对不会告诉您从 read() 调用中返回的内容,因此不能用于省略空检查。”我正在使用迭代器从 S3 存储桶中读取 .gz 文本文件,并且迭代器中的一些行产生了空对象。然后我更改为我附加的迭代器的实现并停止遇到这种行为。
猜你喜欢
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
相关资源
最近更新 更多