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:
2016-01-20 09:56:29 +01:00
parent 4d049378cc
commit 2a4482d8f4

View File

@@ -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]])