2014-08-10 5 views
2

Я разборе CSV файл, который содержит целочисленные значения, некоторые из них могут отсутствовать:Golang считывать данные из файла и указать отсутствующее значение

1,2,3 
1,2, 
1,2,3 

В моем коде я заселять-структуру с данными :

type Line struct { 
    One *int 
    Two *int 
    Three *int 
} 

Мой текущий догадка для обработки пропущенных значений будет использовать указатель на int для того, чтобы показать, является ли отсутствует значение:

// if nil, then no value in file 
l := &Line{} 
// read and parse... 
l.Three = nil 

Однако, используя этот подход делает assingment к *int громоздким:

l := &Line{} 
// NOT POSSIBLE, NOT COMPILING (cannot use 5 (type int) as type *int in assignment) 
l.One = 5 
// FEELS WRONG, BUT WORKS 
tmpInt := 5 
l.One = &tmpInt 

Как обрабатывать недостающие целые значения?

+0

Это можно делать то, что делает goprotobuf и имеют [вспомогательную функцию] (https://godoc.org/ code.google.com/p/goprotobuf/proto#Int), который принимает int. Возвращаемое значение - это указатель на int, значение которого вы передали функции (например: 'l.One = mypackage.Int (5)'). –

+0

Из любопытства, почему бы не использовать [Reader из пакета CSV] (http://golang.org/pkg/encoding/csv/), который поддерживает пустые поля? – bishop

+0

@TimCooper Это круто. Я также подумал о вспомогательной функции, но предположил, что будет более идиоматический golang способ выражения недостающих значений. Реализация goprotobuf: https://code.google.com/p/goprotobuf/source/browse/proto/lib.go#299, почему не просто: http://play.golang.org/p/gg0up2vfaQ – Kiril

ответ

1

Вы можете использовать функцию, чтобы построить свой Line{} из []string, простой example:

func NewLine(s []string) (l *Line) { 
    fmt.Println(len(s)) 
    if len(s) < 2 { 
     return 
    } 
    l = &Line{} 
    if i, err := strconv.Atoi(s[0]); err == nil { 
     l.One = &i 
    } 
    if i, err := strconv.Atoi(s[1]); err == nil { 
     l.Two = &i 
    } 
    if len(s) == 3 { 
     if i, err := strconv.Atoi(s[2]); err == nil { 
      l.Three = &i 
     } 

    } 
    return 
} 
+1

Это хороший способ решить эту проблему из-за того, что значения указателей по умолчанию - «nil», и, таким образом, не присваивая ничего, вы указываете, что значение отсутствует. – Kiril

+0

Да, именно так обрабатывает пакет json. – OneOfOne

Смежные вопросы