我写了一些代码,旨在从.csv文件创建插入。 我在尝试插入值为NULL的字段时遇到问题。 在大多数情况下,我的.csv中的字段为int,但有时需要为NULL。我知道我不能将“ NULL”作为int传递,但是在创建插入时如何容纳这些NULL记录? / p>
在使用.csv Im的情况下,列CustomerID
可以是int或可以为NULL。
像sql.NullInt64
这样的作品吗?
这是我正在处理的代码:
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().Kind() {
case reflect.String:
f.SetString(record[i])
case reflect.Int:
ival, err := strconv.ParseInt(record[i], 10, f.Type().Bits())
if err != nil {
return err
}
f.SetInt(ival)
case reflect.Float64:
fval, err := strconv.ParseFloat(record[i], f.Type().Bits())
if err != nil {
return err
}
f.SetFloat(fval)
default:
return &UnsupportedType{f.Type().String()}
}
}
return nil
}
type FieldMismatch struct {
expected, found int
}
func (e *FieldMismatch) Error() string {
return "CSV line fields mismatch. Expected " + strconv.Itoa(e.expected) + " found " + strconv.Itoa(e.found)
}
type UnsupportedType struct {
Type string
}
func (e *UnsupportedType) Error() string {
return "Unsupported type: " + e.Type
}