diff --git a/album_csv_reader.go b/album_csv_reader.go index e90959a..fcd4d00 100644 --- a/album_csv_reader.go +++ b/album_csv_reader.go @@ -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]])