Makes the AlbumCsvParser a bit more safe
This d******* puts 00/0000 as a nil date sometimes, and for sure its hard to parse ! We just replace it by a real 0 date The csv from online.bdgest.com is a cat of 3 csv. Only the first one is poulated in our case. We just ignore the new header line when we hit them. We may report an io.EOF in the future !
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/csv"
|
||||
"fmt"
|
||||
"io"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
@@ -64,6 +65,21 @@ func NewAlbumCsvReader(r io.Reader) (*AlbumCsvReader, error) {
|
||||
return res, nil
|
||||
}
|
||||
|
||||
var nullTimeRx = regexp.MustCompile(`(00/)+0000`)
|
||||
|
||||
func safeParseTime(format, value string, result *time.Time) error {
|
||||
if len(value) == 0 || nullTimeRx.MatchString(value) == true {
|
||||
*result = time.Time{}
|
||||
return nil
|
||||
}
|
||||
var err error
|
||||
*result, err = time.ParseInLocation(format, value, time.UTC)
|
||||
if err != nil {
|
||||
return fmt.Errorf("AlbumCsvReader: %s: %s", cLegalDeposit, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Read get the next line in the CSV and return an Album or an error,
|
||||
// or io.EOF if stream is closed
|
||||
func (r *AlbumCsvReader) Read() (*Album, error) {
|
||||
@@ -81,6 +97,11 @@ func (r *AlbumCsvReader) Read() (*Album, error) {
|
||||
Collection: data[r.columns[cCollection]],
|
||||
}
|
||||
|
||||
// simply skip new columns Name
|
||||
if data[0] == "IdRevue" || data[0] == "IdParaBD" {
|
||||
return r.Read()
|
||||
}
|
||||
|
||||
ID, err := strconv.ParseInt(data[r.columns[cID]], 0, 64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AlbumCsvReader: %s: %s", cID, err)
|
||||
@@ -96,19 +117,9 @@ func (r *AlbumCsvReader) Read() (*Album, error) {
|
||||
}
|
||||
res.Num = int(n)
|
||||
}
|
||||
if len(data[r.columns[cLegalDeposit]]) != 0 {
|
||||
res.LegalDeposit, err = time.ParseInLocation("01/2006", data[r.columns[cLegalDeposit]], time.UTC)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AlbumCsvReader: %s: %s", cLegalDeposit, err)
|
||||
}
|
||||
}
|
||||
|
||||
if len(data[r.columns[cPrintDate]]) != 0 {
|
||||
res.PrintDate, err = time.ParseInLocation("01/2006", data[r.columns[cPrintDate]], time.UTC)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AlbumCsvReader: %s: %s", cPrintDate, err)
|
||||
}
|
||||
}
|
||||
safeParseTime("01/2006", data[r.columns[cLegalDeposit]], &(res.LegalDeposit))
|
||||
safeParseTime("01/2006", data[r.columns[cPrintDate]], &(res.PrintDate))
|
||||
|
||||
state, err := strconv.ParseInt(data[r.columns[cState]], 0, 32)
|
||||
if err != nil {
|
||||
@@ -116,12 +127,7 @@ func (r *AlbumCsvReader) Read() (*Album, error) {
|
||||
}
|
||||
res.State = AlbumState(state)
|
||||
|
||||
if len(data[r.columns[cPurchaseDate]]) != 0 {
|
||||
res.PurchaseDate, err = time.ParseInLocation("02/01/2006", data[r.columns[cPurchaseDate]], time.UTC)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("AlbumCsvReader: %s: %s", cPurchaseDate, err)
|
||||
}
|
||||
}
|
||||
safeParseTime("02/01/2006", data[r.columns[cPurchaseDate]], &(res.PurchaseDate))
|
||||
|
||||
res.SatID = fmt.Sprintf("%s-%s", data[r.columns[cPerso1]], data[r.columns[cPerso2]])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user