2013-07-02 39 views
10

Scalaでは、file.gzに含まれるテキストをどのように解凍して処理できますか?変数に格納されたファイルの内容を持っているか、後でプログラムが読み込むことができるようにローカルファイルとして保存することに満足しています。scalaの解凍と読み込みのgzipファイル

具体的には、圧縮ログデータを処理するためにScaldingを使用していますが、ScaldingはFileSource.scalaでそれらを読み取る方法を定義していません。ここで

+2

あなたはJavaの 'java.util.zipを使用してGZIPからコンテンツを抽出することができます。 GZipInputStream'を実行し、より良いファイルライブラリを持つコンテンツである – 4lex1v

+1

を処理します。https://github.com/pathikrit/better-files/blob/master/README.mdによると、 '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

このソリューションを使用したと言いたいのですが、このソリューションのBufferedReaderIteratorは、reader.readyメソッドの性質上、ヌルラインを生成しました。 ここに私が見つけた正しい[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()呼び出しから返されるコンテンツについては全く何も知らないので、ヌルチェックを無効にすることはできません。 私はイテレータを使用してS3バケットから.gzテキストファイルを読み込み、イテレータからいくつかの行がヌルオブジェクトを生成しました。次に、私がアタッチしたイテレータの実装に変更し、この動作の発生を停止しました。 –

関連する問題