aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/datamaps/reader.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/datamaps/reader.go')
-rw-r--r--pkg/datamaps/reader.go29
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
}