对于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
}