如何从CSV文件自动反序列化/解组编码到Go结构中的问题。
例如,我有
type Test struct {
Name string
Surname string
Age int
}
CSV文件包含记录
John;Smith;42
Piter;Abel;50
是否有一种简单的方法可以将这些记录解组为struct,除非使用" encoding / csv"用于阅读记录然后做类似
的包record, _ := reader.Read()
test := Test{record[0],record[1],atoi(record[2])}
答案 0 :(得分:11)
似乎我已经完成了将CSV记录自动封送到结构体(仅限于字符串和整数)。希望这会有用。
以下是操场的链接:http://play.golang.org/p/kwc32A5mJf
func Unmarshal(reader *csv.Reader, v interface{}) error {
record, err := reader.Read()
if err != nil {
return err
}
s := reflect.ValueOf(v).Elem()
if s.NumField() != len(record) {
return &FieldMismatch{s.NumField(), len(record)}
}
for i := 0; i < s.NumField(); i++ {
f := s.Field(i)
switch f.Type().String() {
case "string":
f.SetString(record[i])
case "int":
ival, err := strconv.ParseInt(record[i], 10, 0)
if err != nil {
return err
}
f.SetInt(ival)
default:
return &UnsupportedType{f.Type().String()}
}
}
return nil
}
我会尝试创建github包,有人需要这个实现。
答案 1 :(得分:3)
还有gocsv以与/ json相同的方式处理自定义结构。 您还可以为特定类型编写自定义marshaller和unmarshaller。
答案 2 :(得分:1)
你可以烤自己的。也许是这样的:
package main
import (
"fmt"
"strconv"
"strings"
)
type Test struct {
Name string
Surname string
Age int
}
func (t Test) String() string {
return fmt.Sprintf("%s;%s;%d", t.Name, t.Surname, t.Age)
}
func (t *Test) Parse(in string) {
tmp := strings.Split(in, ";")
t.Name = tmp[0]
t.Surname = tmp[1]
t.Age, _ = strconv.Atoi(tmp[2])
}
func main() {
john := Test{"John", "Smith", 42}
fmt.Printf("john:%v\n", john)
johnString := john.String()
fmt.Printf("johnString:%s\n", johnString)
var rebornJohn Test
rebornJohn.Parse(johnString)
fmt.Printf("rebornJohn:%v\n", rebornJohn)
}
答案 3 :(得分:1)
就您而言,这可能是:
package main
import (
"encoding/csv"
"fmt"
"io"
"os"
"github.com/jszwec/csvutil"
)
type Test struct {
Name string
Surname string
Age int
}
func main() {
csv_file, _ := os.Open("test.csv")
reader := csv.NewReader(csv_file)
reader.Comma = ';'
userHeader, _ := csvutil.Header(Test{}, "csv")
dec, _ := csvutil.NewDecoder(reader, userHeader...)
var users []Test
for {
var u Test
if err := dec.Decode(&u); err == io.EOF {
break
}
users = append(users, u)
}
fmt.Println(users)
}