2013-07-02 38 views
10

在Scala中,如何解压缩包含在file.gz中的文本以便它可以被处理?我会很高兴将文件的内容存储在一个变量中,或者将其保存为本地文件,以便后面的程序可以读取它。解压缩并读取scala中的gzip文件

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

+2

您可以提取使用Java'java.util.zip从gzip的内容。 GZipInputStream',然后根据https://github.com/pathikrit/better-files/blob/master/README.md使用更好的文件库,它的内容 – 4lex1v

+1

,它是'myFile.newInputStream.gzipped.lines'。 –

回答

17

这里是我的版本:

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上实现一个迭代器](http://viewfromthefringe.blogspot.de/2007/10/making-bufferedreader-iterable.html),我发现 –

+1

出于好奇,该文件导致了空行? – dhg

+1

这是在这[后]讨论(http://stackoverflow.com/questions/5244839/does-bufferedreader-ready-method-ensure-that-readline-method-does-not-return):“... ...调用ready()的结果告诉你绝对没有关于你从read()调用返回的内容,所以不能用来消除null检查。“ 我正在使用迭代器从S3存储桶中读取.gz文本文件,并且从迭代器中的一些行产生了空对象。然后我改变了我附加的迭代器的实现,并停止了遇到这种行为。 –