forked from buckhx/gobert
/
csv.go
53 lines (50 loc) · 1.01 KB
/
csv.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import (
"encoding/csv"
"fmt"
"io"
"log"
"os"
)
// TextHeader is the required column name in the CSV
// It is case-sensitive
const TextHeader = "text"
// readCSV will read a CSV file and parse the records into maps keyed by column headers, requires a column with the header "text"
func readCSV(path string, d rune) ([]map[string]string, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
rows := csv.NewReader(f)
rows.Comma = d
headers, err := rows.Read()
if err != nil {
return nil, err
}
tdx := -1
for i, h := range headers {
if h == TextHeader {
tdx = i
break
}
}
if tdx < 0 {
return nil, fmt.Errorf("File Missing TextHeader %q", TextHeader)
}
recs := []map[string]string{}
for {
row, err := rows.Read()
if err == io.EOF {
break
} else if err != nil {
log.Println("Warning:", err)
}
rec := make(map[string]string, len(row))
for i, v := range row {
rec[headers[i]] = v
}
recs = append(recs, rec)
}
return recs, nil
}