Search code examples
csvgostrconv

Read CSV String Into List of Custom Objects Go Language


I am trying to read a string of data from a csv file and parse the data into a list of custom objects. The main issue that I am having is converting the data to the correct datatype within the loop.

Here is my custom object:

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

Here is my function that gets the data and attempts to parse it:

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
}

Here is some sample data of which would be returned and placed in the data variable:

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

I am new to the go language and would really appreciate any advice. Thanks in advance!


Solution

  • There's a few things that I notice right off the bat:

    • You're not using a time.Time object to send to your yahooInfoObj struct. You're sending a string

    • You're calling functions that return multiple values in a "single value context". This means that you are just expecting to ignore the second value, but to Go this is an error in your coding. You'll have to explicitly set these values.

    • You're not checking multiple errors. Always check errors - it'll prevent "gotchas" in the future.

    It's not perfect, but here's a seemingly working playground: https://play.golang.org/p/idQFFVjS-X