2016-02-21 1 views
0

Я пытаюсь прочитать строку данных из файла csv и проанализировать данные в списке пользовательских объектов. Основная проблема, с которой я столкнулась, заключается в преобразовании данных в правильный тип данных в цикле.Чтение строки CSV в список пользовательских объектов Go Language

Вот мой пользовательский объект:

type yahooInfoObj struct { 
    date time.Time 
    open float32 
    high float32 
    low float32 
    close float32 
    volume int 
    adjClose float32 
} 

Вот моя функция, которая получает данные и пытается разобрать его:

func getSingleCompanyData(search searchObj) []yahooInfoObj { 
    searchQuery := buildYahooFinanceDataQueryString(search) 
    data := getRequest(searchQuery) 

    r := csv.NewReader(strings.NewReader(data)) 
    var stats []yahooInfoObj 

    // Read csv file 
    result, _ := r.ReadAll() 

    //loop through each returned stat (line) 
    for i := range result { 
     //skip the first entry due to column names being returned 
     if i != 0{ 
      stat := result[i] 
      stats = append(stats, yahooInfoObj{stat[0],strconv.ParseFloat(stat[1],32),strconv.ParseFloat(stat[2],32),strconv.ParseFloat(stat[3],32),strconv.ParseFloat(stat[4],32),strconv.Atoi(stat[5]),strconv.ParseFloat(stat[6],32)}) 
     } 
    } 

    return stats 
} 

Вот некоторые примеры данных, которые будут возвращены и помещены в переменной данных:

Date,Open,High,Low,Close,Volume,Adj Close 
2010-12-31,31.219999,31.33,30.93,31.299999,11716300,29.517661 
2010-12-30,31.450001,31.58,31.209999,31.290001,12989400,29.508232 
2010-12-29,31.530001,31.690001,31.42,31.50,9769000,29.706273 
2010-12-28,31.66,31.76,31.41,31.57,9736000,29.772287 

Я новичок в выборе языка и действительно буду приветствуйте любые советы. Заранее спасибо!

+1

Единственное, что я заметил, что вы не преобразования стат [0] в time.Time. Вы можете сделать это со временем. Parse() или time.ParseInLocation(). У вас есть какие-то конкретные вопросы? –

ответ

1

Там несколько вещей, которые я замечаю сразу же:

  • Вы не используете time.Time объект для отправки вашего yahooInfoObj структуры. Вы отправляете строку

  • Вы вызываете функции, которые возвращают несколько значений в контексте «одного значения». Это означает, что вы просто ожидаете игнорировать второе значение, но для Go это ошибка в вашей кодировке. Вам нужно будет явно установить эти значения.

  • Вы не проверяете несколько ошибок. Всегда проверяйте ошибки - это предотвратит «gotchas» в будущем.

Это не идеально, но вот, казалось бы, рабочая площадка: https://play.golang.org/p/idQFFVjS-X