MultiCSV is a multi-reader that provides the logical concatenation of the input CSV readers.
The readers are read sequentially. Once all inputs have returned EOF, Read returns EOF.
If any reader returns a non-nil, non-EOF error, Read returns that error.
go get -u github.com/zero-pkg/multicsv
r:=multicsv.NewReader(
multicsv.LazyFileReader("data/users.csv"),
multicsv.LazyFileReader("data/users2.csv", multicsv.WithSkipHeader()),
)
deferr.Close()
records, err:=r.ReadAll()
iferr!=nil {
panic(err)
}
fmt.Println(records)You can also read CSV data from bytes with the same options:
r:=multicsv.NewReader(
multicsv.BytesReader(data, multicsv.WithSkipHeader()),
)Use WithAutoDetectDelimiter when a file can use a common delimiter such as ,, ;, tab, or |:
r:=multicsv.NewReader(
multicsv.LazyFileReader("data/users.csv", multicsv.WithAutoDetectDelimiter()),
)funcmain() {
r:=multicsv.NewReader(
customReader("data/count_10.csv"),
customReader("data/count_100.csv"),
)
_=r
}
funccustomReader(pathstring) *multicsv.LazyReader {
varfile*os.Filereturn&multicsv.LazyReader{
Init: func() (*csv.Reader, error) {
f, err:=os.Open(path)
iferr!=nil {
returnnil, err
}
// Customize csv.Reader.r:=csv.NewReader(f)
r.LazyQuotes=truefile=freturnr, nil
},
CloseFunc: func() error {
iffile==nil {
returnnil
}
returnfile.Close()
},
}
}