-
Notifications
You must be signed in to change notification settings - Fork 0
/
csv-file.go
180 lines (150 loc) · 4.21 KB
/
csv-file.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Copyright 2019 Gytis Repečka (gytis@repecka.com). All rights reserved.
// Use of this source code is governed by a GNU GPL license that can be
// found in the LICENSE file.
package main
import (
"fmt"
"time"
"os"
"encoding/csv"
"io"
// "log"
// "bufio"
// "strings"
"strconv"
"errors"
)
// Todo: push loaded data to this struct
type carDiagData struct {
dataTimestamp string
engineRpm float64
fuelFlow float64
intakeAirTemp uint
speedObd uint
massAirFlow float64
throttlePos float64
voltageObd float64
engineCoolTemp uint
}
// Format date
func ConvertStrToDate (inStr string) (string, error) {
// Timestamp layout of data in CSV file
timestampLayoutFile := "Mon Jan 02 15:04:05 MST 2006"
// Timestamp layout to output
timestampLayoutOut := "2006-01-02 15:04:05"
var timestampOut string
timestamp, err := time.Parse(timestampLayoutFile, inStr)
if err != nil {
return "", errors.New("Can't convert string to date!")
} else {
timestampOut = timestamp.Format(timestampLayoutOut)
return timestampOut, nil
}
}
// String to float
func ConvertStrToFloat (inStr string) (float64, error) {
flt, err := strconv.ParseFloat(inStr, 64)
if err != nil {
return 0, errors.New("Can't convert string to float!")
} else {
return flt, nil
}
}
// Convert string to integer
func ConvertStrToInt(inStr string) (int, error) {
intg, err := strconv.Atoi(inStr)
if err != nil {
return 0, errors.New("Can't convert string to int!")
} else {
return intg, nil
}
}
func main() {
currentTime := time.Now()
inputFileName := "trackLog-sample.csv"
fmt.Printf("File to process: %s\n", inputFileName)
fmt.Printf("Started: %s.\n", currentTime.Format("2006-01-02 15:04:05.000 (MST Z07:00)"))
fmt.Println("--------------------")
csvFile, err := os.Open(inputFileName)
// Close file in the end of main
defer csvFile.Close()
if err != nil {
fmt.Printf("There was an error opening file: %s.\n", err)
return
}
// Read CSV file
fileReader := csv.NewReader(csvFile)
// Reader options
// - Field delimiter
fileReader.Comma = ','
// - Each record field count must match header (0) record field count
fileReader.FieldsPerRecord = 0
// / Reader options
recordCount := 0
for {
// Read one line at one iteration
record, err := fileReader.Read()
// If end of file, stop reading file
if err == io.EOF {
break
}
// If error in record, stop reading file
if err != nil {
// log.Fatal(err)
fmt.Printf("Error in record: %s.\n", err)
break
}
// Perform actions with record
// Record is an array of fields
// If it is first record, treat it as header
if recordCount == 0 {
fmt.Printf("Fields: %d\n\n", len(record))
fmt.Printf("\n---------------------------\n")
// Iterate through record elements (fields)
fmt.Printf("|")
// for i := 0; i < len(record); i++ {
// For experimenting only output 4 fiels
for i := 0; i < 4; i++ {
fmt.Printf(" %s |", record[i])
}
fmt.Printf("\n---------------------------\n")
} else {
// Process data record (not header)
field0, err := ConvertStrToDate(record[0])
if err != nil {
// Instead of returned error output question mark
fmt.Printf("(?)")
} else {
fmt.Printf("(%s) ", field0)
}
field1, err := ConvertStrToFloat(record[1])
if err != nil {
fmt.Printf("?.?? | ")
} else {
fmt.Printf("%.2f | ", field1)
}
field2, err := ConvertStrToFloat(record[2])
if err != nil {
fmt.Printf("?.?? | ")
} else {
fmt.Printf("%.2f | ", field2)
}
// Convert string (inputString) to integer (inputInt)
field3, err := ConvertStrToInt(record[3])
if err != nil {
// fmt.Printf("%s", err)
// Instead of ConvertStrToInt returned error output question mark
fmt.Printf("? |")
} else {
fmt.Printf("%d |", field3)
}
fmt.Printf("\n")
// fmt.Println(record)
}
// / Perform actions with record
// Increase counter
recordCount++
}
fmt.Println("--------------------")
fmt.Printf("Total records processed: %d.\n", recordCount)
}