package main import ( "encoding/csv" "fmt" "os" "strconv" "src.wolkict.net/sepa/pain" ) // FieldsPerBatchLine are the expected number of fields in each CSV line. const FieldsPerBatchLine = 9 // ImportIndex keeps track of what column corresponds to what data. type ImportIndex int // These are our numbered input fields const ( ImportName ImportIndex = iota ImportAddr1 ImportAddr2 ImportCountry ImportIBAN ImportMandateId ImportSignatureDate ImportAmount ImportInfo ) func ImportCSV(fn string) ([]pain.DrctDbtTxInf, error) { f, err := os.Open(fn) if err != nil { return nil, fmt.Errorf("opening file %q failed: %v", fn, err) } defer f.Close() csvReader := csv.NewReader(f) csvReader.FieldsPerRecord = FieldsPerBatchLine all, err := csvReader.ReadAll() if err != nil { return nil, fmt.Errorf("reading csv %q failed: %v", fn, err) } ret := make([]pain.DrctDbtTxInf, len(all)) for i, line := range all { if line[0] == "name" { // Header line continue } dbtr := pain.NewDebtor(line[ImportName], line[ImportAddr1], line[ImportAddr2], line[ImportCountry]) dbtrAcct := pain.NewDbtrAcct(line[ImportIBAN]) mandateInfo := pain.NewMandateInfo(line[ImportMandateId], line[ImportSignatureDate]) amount, err := strconv.ParseFloat(line[ImportAmount], 64) if err != nil { return nil, fmt.Errorf("error importing line %d, cannot parse amount: %v", i, err) } ret[i] = pain.NewDirectDebitTransaction(dbtr, dbtrAcct, mandateInfo, amount, line[ImportInfo], i) } return ret, nil }