@@ -15,14 +15,59 @@ package file
1515import (
1616 "bufio"
1717 "compress/bzip2"
18+ "compress/gzip"
1819 "errors"
1920 "io"
2021 "os"
2122 "path"
23+ "strings"
2224)
2325
24- // ReadInputFile reads an input file as a sequence of lines.
25- func ReadInputFile (filename string ) []string {
26+ // ReadAndUncompress reads a given file and, if its extension indicates it is
27+ // compressed, then it decompresses it before returning the decompressed byte
28+ // and the underlying filename (e.g. if original filename was "file.lt.gz" then
29+ // it returns "file.lt"). Supported compression formats are "bz2" and "gz".
30+ func ReadAndUncompress (filename string ) (string , []byte , error ) {
31+ var (
32+ ext = path .Ext (filename )
33+ reader io.Reader
34+ err error
35+ data []byte
36+ )
37+ // Open file for reading
38+ file , err := os .Open (filename )
39+ // Sanity check for error
40+ if err != nil {
41+ return filename , nil , err
42+ }
43+ // Setup file close behaviour
44+ defer func () {
45+ if err := file .Close (); err != nil {
46+ panic (err )
47+ }
48+ }()
49+ //
50+ reader = file
51+ // check extension
52+ switch ext {
53+ case ".bz2" :
54+ reader = bzip2 .NewReader (reader )
55+ filename = strings .TrimSuffix (filename , ext )
56+ case ".gz" :
57+ if reader , err = gzip .NewReader (reader ); err != nil {
58+ return filename , nil , err
59+ }
60+ //
61+ filename = strings .TrimSuffix (filename , ext )
62+ }
63+ //
64+ data , err = io .ReadAll (reader )
65+ //
66+ return filename , data , err
67+ }
68+
69+ // ReadInputFileAsLines reads an input file as a sequence of lines.
70+ func ReadInputFileAsLines (filename string ) []string {
2671 file , err := os .Open (filename )
2772 // Check whether file exists
2873 if errors .Is (err , os .ErrNotExist ) {
0 commit comments