2013-07-02 39 views
10

Trong Scala, cách giải nén văn bản chứa trong file.gz để văn bản có thể được xử lý? Tôi sẽ hài lòng với nội dung của tệp được lưu trữ trong một biến hoặc lưu tệp dưới dạng tệp cục bộ để chương trình có thể đọc sau đó.giải nén và đọc tệp gzip trong scala

Cụ thể, tôi đang sử dụng Scalding để xử lý dữ liệu nhật ký nén, nhưng Scalding không xác định cách đọc chúng trong FileSource.scala.

+2

Bạn có thể trích xuất nội dung từ gzip sử dụng Java 'java.util.zip. GZipInputStream' và sau đó làm việc với nội dung của nó – 4lex1v

+1

với thư viện tệp tốt hơn, đó là 'myFile.newInputStream.gzipped.lines', theo https://github.com/pathikrit/better-files/blob/master/README.md –

Trả lời

17

Dưới đây là phiên bản của tôi:

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))) 
    } 
} 

Sau đó làm:

val iterator = GzFileIterator(new java.io.File("test.txt.gz"), "UTF-8") 
iterator.foreach(println) 
+1

Chỉ muốn nói rằng tôi đã sử dụng giải pháp này, nhưng BufferedReaderIterator trong giải pháp này tạo ra các dòng rỗng, do tính chất của phương thức reader.ready. Đây là một [thực hiện của một trình lặp trên đầu trang của một BufferedReader] (http://viewfromthefringe.blogspot.de/2007/10/making-bufferedreader-iterable.html) mà tôi tìm thấy –

+1

Ngoài sự tò mò, khía cạnh nào của tập tin gây ra các dòng null? – dhg

+1

Nó được thảo luận trong [post] này (http://stackoverflow.com/questions/5244839/does-bufferedreader-ready-method-ensure-that-readline-method-does-not-return): "... The kết quả của cuộc gọi đã sẵn sàng() cho bạn biết hoàn toàn không có gì về nội dung bạn sẽ nhận được từ một cuộc gọi read(), và do đó không thể được sử dụng để bỏ qua một kiểm tra null. " Tôi đang sử dụng trình lặp để đọc các tệp văn bản .gz từ các thùng S3 và một số dòng từ trình vòng lặp mang lại các đối tượng null. Sau đó, tôi thay đổi để thực hiện các iterator mà tôi đính kèm và ngừng trải nghiệm hành vi này. –

Các vấn đề liên quan