業務で複数のcsvファイルがtar.gzで圧縮されており、その一つのファイルを読みだす必要があった。
Golangの場合、標準パッケージのarchive/tar
とcompress/gzip
を使って、ひたすらReaderを重ねていくだけで、実現できた。
package main
import (
"archive/tar"
"compress/gzip"
"encoding/csv"
"fmt"
"io"
"os"
)
func main() {
file, _ := os.Open("target.tar.gz")
defer file.Close()
// gzipの展開
gzipReader, _ := gzip.NewReader(file)
defer gzipReader.Close()
// tarの展開
tarReader := tar.NewReader(gzipReader)
for {
tarHeader, err := tarReader.Next()
if err == io.EOF {
break
}
// ファイルの特定
if tarHeader.Name == "target.csv" {
// あとはCSVの処理
csvReader := csv.NewReader(tarReader)
for {
row, err := csvReader.Read()
if err == io.EOF {
break
}
fmt.Println("csv:", row)
}
}
}
}