/
csv.go
63 lines (54 loc) · 1.24 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
54
55
56
57
58
59
60
61
62
63
package uitl
import (
"encoding/csv"
"io"
"os"
"path/filepath"
"strings"
"golang.org/x/text/encoding"
"golang.org/x/text/encoding/unicode"
"golang.org/x/text/transform"
)
const UTF8BOM string = "\xEF\xBB\xBF"
func CreateCSVFile(filePath string) (f *os.File, err error) {
err = os.MkdirAll(filepath.Dir(filePath), 0o755)
if err != nil {
return
}
return os.Create(filePath)
}
func WriteCSVFile(f *os.File, data *[][]string) error {
f.WriteString(UTF8BOM)
w := csv.NewWriter(f)
for _, v := range *data {
err := w.Write(v)
if err != nil {
return err
}
}
w.Flush()
defer f.Close()
return nil
}
func DataToMap(data *[][]string) (records *[]map[string]string, err error) {
header := []string{}
records = &[]map[string]string{}
for i, record := range *data {
if i == 0 {
for j := 0; j < len(record); j++ {
header = append(header, strings.TrimSpace(record[j]))
}
} else {
l := map[string]string{}
for j := 0; j < len(record); j++ {
l[header[j]] = strings.TrimSpace(record[j])
}
*records = append(*records, l)
}
}
return
}
func BOMAwareCSVReader(reader io.Reader) *csv.Reader {
transformer := unicode.BOMOverride(encoding.Nop.NewDecoder())
return csv.NewReader(transform.NewReader(reader, transformer))
}