【问题标题】:Read CSV String Into List of Custom Objects Go Language将 CSV 字符串读入自定义对象列表 Go 语言
【发布时间】:2016-02-21 04:42:41
【问题描述】:

我正在尝试从 csv 文件中读取一串数据并将数据解析为自定义对象列表。我遇到的主要问题是在循环中将数据转换为正确的数据类型。

这是我的自定义对象:

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

我是 Go 语言的新手,非常感谢任何建议。提前致谢!

【问题讨论】:

  • 我注意到的一件事是您没有将 stat[0] 转换为 time.Time。您可以使用 time.Parse() 或 time.ParseInLocation() 来做到这一点。您有什么具体问题吗?

标签: csv go strconv


【解决方案1】:

我马上就注意到了一些事情:

  • 您没有使用 time.Time 对象发送到您的 yahooInfoObj 结构。你正在发送一个字符串

  • 您正在调用在“单值上下文”中返回多个值的函数。这意味着您只是希望忽略第二个值,但对于 Go,这是您的编码中的错误。您必须明确设置这些值。

  • 您没有检查多个错误。始终检查错误 - 它将防止将来出现“陷阱”。

这并不完美,但这里有一个看似有效的游乐场:https://play.golang.org/p/idQFFVjS-X

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2016-06-24
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多