main.NewCSVHandler   B
last analyzed

Complexity

Conditions 7

Size

Total Lines 35
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 23
nop 1
dl 0
loc 35
rs 7.9279
c 0
b 0
f 0
1
package main
2
3
import (
4
	"encoding/csv"
5
	"fmt"
6
	"os"
7
	"path/filepath"
8
)
9
10
// CSVHandler handles CSV file.
11
type CSVHandler struct {
12
	header    []string
13
	headerMap map[string]int
14
	reader    *csv.Reader
15
}
16
17
// NewCSVHandler returns initialized *CSVHandler
18
func NewCSVHandler(file string) (*CSVHandler, error) {
19
	info, err := os.Stat(file)
20
	if err == nil && info.IsDir() {
21
		return nil, fmt.Errorf("'%s' is dir, please set file path", file)
22
	}
23
24
	// load file
25
	fp, err := os.Open(file)
26
	if err != nil {
27
		return nil, err
28
	}
29
30
	// load csv
31
	reader := csv.NewReader(fp)
32
	reader.LazyQuotes = true
33
	switch filepath.Ext(file) {
34
	case ".tsv":
35
		reader.Comma = '\t'
36
	}
37
38
	header, err := reader.Read()
39
	if err != nil {
40
		return nil, err
41
	}
42
43
	headerMap := make(map[string]int)
44
	for i, col := range header {
45
		headerMap[col] = i
46
	}
47
48
	return &CSVHandler{
49
		header:    header,
50
		headerMap: headerMap,
51
		reader:    reader,
52
	}, nil
53
}
54
55
// ReadAll reads all lines from CSV file.
56
func (f *CSVHandler) ReadAll() ([]map[string]string, error) {
57
	if f.reader == nil {
58
		return nil, fmt.Errorf("f.reader is nil")
59
	}
60
61
	lines, err := f.reader.ReadAll()
62
	if err != nil {
63
		return nil, err
64
	}
65
66
	header := f.header
67
	result := make([]map[string]string, len(lines))
68
	for i, line := range lines {
69
		r := make(map[string]string)
70
		for j, col := range line {
71
			r[header[j]] = col
72
		}
73
		result[i] = r
74
	}
75
	return result, nil
76
}
77