diff options
Diffstat (limited to 'pkg/datamaps/reader.go')
-rw-r--r-- | pkg/datamaps/reader.go | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/pkg/datamaps/reader.go b/pkg/datamaps/reader.go index 7479206..d27d386 100644 --- a/pkg/datamaps/reader.go +++ b/pkg/datamaps/reader.go @@ -51,6 +51,7 @@ func sheetInSlice(list []string, key string) bool { return true } } + return false } @@ -58,64 +59,76 @@ func sheetInSlice(list []string, key string) bool { // in a slice of DatamapLine structs. func getSheetNames(dmls []DatamapLine) []string { var sheetNames []string + for _, dml := range dmls { - if sheetInSlice(sheetNames, dml.Sheet) == false { + if !sheetInSlice(sheetNames, dml.Sheet) { sheetNames = append(sheetNames, dml.Sheet) } } + return sheetNames } //ReadDML returns a slice of DatamapLine structs. func ReadDML(path string) ([]DatamapLine, error) { var s []DatamapLine + data, err := ioutil.ReadFile(path) + if err != nil { return s, fmt.Errorf("Cannot find file: %s", path) } + r := csv.NewReader(strings.NewReader(string(data))) + for { record, err := r.Read() if err == io.EOF { break } + if err != nil { return s, errors.New("Cannot read line %s") } + if record[0] == "cell_key" { // this must be the header continue } + dml := DatamapLine{ Key: strings.Trim(record[0], " "), Sheet: strings.Trim(record[1], " "), Cellref: strings.Trim(record[2], " ")} s = append(s, dml) } + return s, nil } -//ReadXLSX returns the file's data as a map, +// ReadXLSX returns the file's data as a map, // keyed on sheet name. All values are returned as strings. // Paths to a datamap and the spreadsheet file required. func ReadXLSX(ssheet string) FileData { - // open the files data, err := xlsx.OpenFile(ssheet) if err != nil { log.Fatal(err) } + outer := make(FileData, 1) // get the data for _, sheet := range data.Sheets { inner := make(SheetData) + for rowLidx, row := range sheet.Rows { for colLidx, cell := range row.Cells { colStr, err := coords.ColIndexToAlpha(colLidx) if err != nil { log.Fatal(err) } + ex := ExtractedCell{ Cell: cell, Col: colStr, @@ -124,9 +137,11 @@ func ReadXLSX(ssheet string) FileData { cellref := fmt.Sprintf("%s%d", ex.Col, ex.Row) inner[cellref] = ex } + outer[sheet.Name] = inner } } + return outer } @@ -137,9 +152,11 @@ func ReadXLSX(ssheet string) FileData { func Extract(dm string, ssheet string) ExtractedData { xdata := ReadXLSX(ssheet) ddata, err := ReadDML(dm) + if err != nil { log.Fatal(err) } + names := getSheetNames(ddata) outer := make(ExtractedData, len(names)) inner := make(map[string]xlsx.Cell) @@ -147,11 +164,13 @@ func Extract(dm string, ssheet string) ExtractedData { for _, i := range ddata { sheet := i.Sheet cellref := i.Cellref + if val, ok := xdata[sheet][cellref]; ok { inner[cellref] = *val.Cell outer[sheet] = inner } } + return outer } @@ -160,13 +179,17 @@ func GetTargetFiles(path string) ([]string, error) { if lastchar := path[len(path)-1:]; lastchar != string(filepath.Separator) { return nil, fmt.Errorf("path must end in a %s character", string(filepath.Separator)) } + fullpath := strings.Join([]string{path, "*.xlsx"}, "") output, err := filepath.Glob(fullpath) + if err != nil { return nil, err } + if output == nil { return nil, fmt.Errorf("cannot find any xlsx files in %s", path) } + return output, nil } |