mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-27 17:25:16 +00:00
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
|
package csvsource
|
||
|
|
||
|
import (
|
||
|
"encoding/csv"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
var _ TickReader = (*CSVTickReader)(nil)
|
||
|
|
||
|
// CSVTickReader is a CSVTickReader that reads from a CSV file.
|
||
|
type CSVTickReader struct {
|
||
|
csv *csv.Reader
|
||
|
decoder CSVTickDecoder
|
||
|
ticks []*CsvTick
|
||
|
}
|
||
|
|
||
|
// MakeCSVTickReader is a factory method type that creates a new CSVTickReader.
|
||
|
type MakeCSVTickReader func(csv *csv.Reader) *CSVTickReader
|
||
|
|
||
|
// NewCSVKLineReader creates a new CSVKLineReader with the default Binance decoder.
|
||
|
func NewCSVTickReader(csv *csv.Reader) *CSVTickReader {
|
||
|
return &CSVTickReader{
|
||
|
csv: csv,
|
||
|
decoder: BinanceCSVTickDecoder,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// NewCSVTickReaderWithDecoder creates a new CSVKLineReader with the given decoder.
|
||
|
func NewCSVTickReaderWithDecoder(csv *csv.Reader, decoder CSVTickDecoder) *CSVTickReader {
|
||
|
return &CSVTickReader{
|
||
|
csv: csv,
|
||
|
decoder: decoder,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// ReadAll reads all the KLines from the underlying CSV data.
|
||
|
func (r *CSVTickReader) ReadAll() (ticks []*CsvTick, err error) {
|
||
|
var i int
|
||
|
for {
|
||
|
tick, err := r.Read(i)
|
||
|
if err == io.EOF {
|
||
|
break
|
||
|
}
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
i++ // used as jump logic inside decoder to skip csv headers in case
|
||
|
if tick == nil {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
ticks = append(ticks, tick)
|
||
|
}
|
||
|
|
||
|
return ticks, nil
|
||
|
}
|
||
|
|
||
|
// Read reads the next KLine from the underlying CSV data.
|
||
|
func (r *CSVTickReader) Read(i int) (*CsvTick, error) {
|
||
|
rec, err := r.csv.Read()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return r.decoder(rec, i)
|
||
|
}
|