Skip to content

Instantly share code, notes, and snippets.

@stevekm
Created November 1, 2023 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stevekm/e962962e18ece19f1be7b95308e47639 to your computer and use it in GitHub Desktop.
Save stevekm/e962962e18ece19f1be7b95308e47639 to your computer and use it in GitHub Desktop.
Go program to read and write a .gz file (fastq.gz)
package main
import (
"fmt"
// "compress/gzip"
gzip "github.com/klauspost/pgzip"
"bufio"
"os"
"log"
)
func GetReader(inputFilepath string) (*bufio.Reader, *os.File, *os.File) {
// defer file.Close()
// defer gzFile.Close()
var reader *bufio.Reader
var file *os.File
var gzFile *os.File
bufferSize := 1048576 // default 4096: 4KB ; 1048576 : 1MB ; 10485760 : 10MB
file, err := os.Open(inputFilepath)
if err != nil {
log.Fatalf("Error opening file: %v\n", err)
}
gz, err := gzip.NewReader(file)
if err != nil {
log.Fatalf("Error opening file: %v\n", err)
}
reader = bufio.NewReaderSize(gz, bufferSize)
return reader, file, gzFile
}
func GetWriter(outputFilepath string) (*os.File, *gzip.Writer) {
// GzWriter.Flush()
// GzWriter.Close()
// File.Close()
outputFile, err := os.Create(outputFilepath)
if err != nil {
log.Fatalf("Error creating output file: %v\n", err)
}
writer, err := gzip.NewWriterLevel(outputFile, gzip.BestCompression)
if err != nil {
log.Fatalf("Error creating output writer: %v\n", err)
}
return outputFile, writer
}
func main(){
// input
inputFilepath := "data/test1.fastq.gz"
reader, file, gzFile := GetReader(inputFilepath)
defer file.Close()
defer gzFile.Close()
// output
outputFilepath := "data.gz"
outputFile, writer := GetWriter(outputFilepath)
defer outputFile.Close()
var delim byte = '\n'
for {
line, err := reader.ReadBytes(delim) // includes the delim in the output line !!
if err != nil {
break // end of file io.EOF
}
writer.Write(line)
}
writer.Flush()
writer.Close()
fmt.Println("done")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment