-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsvreader.go
115 lines (102 loc) · 2.23 KB
/
csvreader.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
package magda_drones2wrf
import (
"fmt"
"encoding/csv"
"io"
"os"
"strconv"
"time"
)
func parseFloat(s string) (Value, error) {
f, err := strconv.ParseFloat(s, 64)
if err != nil {
return NaN(), err
}
return Value(f), nil
}
func ReadAll(dataPath string) (Observation, error) {
observation := Observation{}
obsF, err := os.Open(dataPath)
if err != nil {
return observation, err
}
defer obsF.Close()
csvReader := csv.NewReader(obsF)
csvReader.Comma = ';'
var data [][]string
k := 0
for {
record, err := csvReader.Read()
if err == io.EOF {
break
}
if err != nil {
return observation, err
}
data = append(data, record)
k++
}
k--
observation.NLEV = k
fmt.Printf("N. of levels. %d\n", observation.NLEV)
const PRESSURE = 3
const ALTITUDE = 4
const TEMPERATURE = 5
const HUMIDITY = 6
const WIND_SPEED = 7
const WIND_DIRECTION = 8
const HEAD_DATE = 0
const HEAD_LAT = 1
const HEAD_LON = 2
header := data[1]
obsTime, err := time.Parse("2006-01-02 15:04", header[HEAD_DATE])
if err != nil {
return observation, err
}
observation.ObsTimeUtc = obsTime
observation.StationName = "XXX"
observation.StationID = "XXX"
observation.Elevation = ConfigValues.Elevation
data = data[1:]
observation.Lat, err = strconv.ParseFloat(header[HEAD_LAT], 64)
if err != nil {
return observation, err
}
observation.Lon, err = strconv.ParseFloat(header[HEAD_LON], 64)
if err != nil {
return observation, err
}
observation.Measures = make([]Measure, len(data))
for i, row := range data {
var m Measure
var err error
m.Dewpoint = NaN()
m.Temperature, err = parseFloat(row[TEMPERATURE])
if err != nil {
return observation, err
}
m.WindSpeed, err = parseFloat(row[WIND_SPEED])
if err != nil {
return observation, err
}
m.WindDirection, err = parseFloat(row[WIND_DIRECTION])
if err != nil {
return observation, err
}
m.Pressure, err = parseFloat(row[PRESSURE])
if err != nil {
return observation, err
}
m.Precipitation = NaN()
m.Humidity, err = parseFloat(row[HUMIDITY])
if err != nil {
return observation, err
}
m.Altitude, err = parseFloat(row[ALTITUDE])
if err != nil {
return observation, err
}
observation.Measures[i] = m
}
return observation, nil
}