v
Зеркало из https://github.com/vlang/v
1module csv
2
3import strconv
4
5// decode csv to struct
6pub fn decode[T](data string) []T {
7mut result := []T{}
8if data == '' {
9return result
10}
11
12mut parser := new_reader(data)
13mut columns_names := []string{}
14mut i := 0
15for {
16items := parser.read() or { break }
17if i == 0 {
18for val in items {
19columns_names << val
20}
21} else {
22mut t_val := T{}
23$for field in T.fields {
24col := get_column(field.name, columns_names)
25if col > -1 && col < items.len {
26$if field.typ is string {
27t_val.$(field.name) = items[col]
28} $else $if field.typ is int {
29t_val.$(field.name) = items[col].int()
30} $else $if field.typ is f32 {
31t_val.$(field.name) = f32(strconv.atof64(items[col]) or { f32(0.0) })
32} $else $if field.typ is f64 {
33t_val.$(field.name) = strconv.atof64(items[col]) or { f64(0.0) }
34} $else $if field.typ is bool {
35t_val.$(field.name) = string_to_bool(items[col])
36}
37}
38}
39result << t_val
40}
41i++
42}
43
44return result
45}
46
47fn string_to_bool(val string) bool {
48l_val := val.to_lower().trim_space()
49if l_val == 'true' {
50return true
51}
52
53i_val := val.int()
54if i_val != 0 {
55return true
56}
57
58return false
59}
60
61fn get_column(name string, columns []string) int {
62for i, val in columns {
63if val == name {
64return i
65}
66}
67return -1
68}
69