对于gz压缩文件,是gz,gz,gz,不是zip,不是gzip,不是rar, 对就是gz压缩文件的处理。
业务场景: 需要对gz压缩文件内存解压,并处理读取处理,之后再保存到存储介质上;非gz压缩文件做copy处理.
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"os"
"strings"
)
//inFilename gz压缩文件全路径 outFilename输出的压缩文件全路径
func FixFileData(inFilename, outFilename string) error {
w, err := os.Create(outFilename)
if err != nil {
fmt.Println("crate error:", err.Error())
return err
}
defer w.Close()
if strings.HasSuffix(inFilename, ".gz") { //处理压缩文件
fr, err := os.Open(inFilename)
if err != nil {
return err
}
defer fr.Close()
gzReader, err := gzip.NewReader(fr)
if err != nil {
return err
}
defer gzReader.Close()
gzContext, err := ioutil.ReadAll(gzReader)
if err != nil {
return err
}
var writeContext bytes.Buffer
writeContext.Reset()
context := string(gzContext)
conLines := strings.Split(context, "\n")
for _, valueLine := range conLines {
lineSplit := strings.Split(valueLine, columnSeparator)
//业务处理
valueLine = strings.Replace(valueLine, "old", "new", -1)
writeContext.WriteString(valueLine + "\n")
}
writer := gzip.NewWriter(w)
defer writer.Close()
_, err = writer.Write(writeContext.Bytes())
if err != nil {
return err
}
} else {
rc, err := os.Open(inFilename)
if err != nil {
return err
}
defer rc.Close()
_, err = io.Copy(w, rc)
if err != nil {
return err
}
}
return nil
}