在Scala中,如何解压缩包含在file.gz
中的文本以便它可以被处理?我会很高兴将文件的内容存储在一个变量中,或者将其保存为本地文件,以便后面的程序可以读取它。解压缩并读取scala中的gzip文件
具体来说,我使用Scalding来处理压缩的日志数据,但Scalding没有定义在FileSource.scala
中读取它们的方法。
在Scala中,如何解压缩包含在file.gz
中的文本以便它可以被处理?我会很高兴将文件的内容存储在一个变量中,或者将其保存为本地文件,以便后面的程序可以读取它。解压缩并读取scala中的gzip文件
具体来说,我使用Scalding来处理压缩的日志数据,但Scalding没有定义在FileSource.scala
中读取它们的方法。
这里是我的版本:
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生成了空行。 这是一个正确的[在BufferedReader上实现一个迭代器](http://viewfromthefringe.blogspot.de/2007/10/making-bufferedreader-iterable.html),我发现 –
出于好奇,该文件导致了空行? – dhg
这是在这[后]讨论(http://stackoverflow.com/questions/5244839/does-bufferedreader-ready-method-ensure-that-readline-method-does-not-return):“... ...调用ready()的结果告诉你绝对没有关于你从read()调用返回的内容,所以不能用来消除null检查。“ 我正在使用迭代器从S3存储桶中读取.gz文本文件,并且从迭代器中的一些行产生了空对象。然后我改变了我附加的迭代器的实现,并停止了遇到这种行为。 –
您可以提取使用Java'java.util.zip从gzip的内容。 GZipInputStream',然后根据https://github.com/pathikrit/better-files/blob/master/README.md使用更好的文件库,它的内容 – 4lex1v
,它是'myFile.newInputStream.gzipped.lines'。 –