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)
このソリューションを使用したと言いたいのですが、このソリューションのBufferedReaderIteratorは、reader.readyメソッドの性質上、ヌルラインを生成しました。 ここに私が見つけた正しい[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()呼び出しから返されるコンテンツについては全く何も知らないので、ヌルチェックを無効にすることはできません。 私はイテレータを使用してS3バケットから.gzテキストファイルを読み込み、イテレータからいくつかの行がヌルオブジェクトを生成しました。次に、私がアタッチしたイテレータの実装に変更し、この動作の発生を停止しました。 –
あなたはJavaの 'java.util.zipを使用してGZIPからコンテンツを抽出することができます。 GZipInputStream'を実行し、より良いファイルライブラリを持つコンテンツである – 4lex1v
を処理します。https://github.com/pathikrit/better-files/blob/master/README.mdによると、 'myFile.newInputStream.gzipped.lines'です。 –