将 CSV 字符串读入自定义对象列表 Go 语言
Read CSV String Into List of Custom Objects Go Language
我正在尝试从 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 语言的新手,非常感谢任何建议。提前致谢!
有几件事我马上就注意到了:
您没有使用 time.Time
对象发送到您的 yahooInfoObj
结构。您正在发送字符串
您正在调用return "single value context" 多个值的函数。这意味着您只是希望忽略第二个值,但对于 Go 来说,这是您编码中的错误。您必须明确设置这些值。
您没有检查多个错误。始终检查错误 - 它会在将来防止 "gotchas"。
它并不完美,但这是一个看似有效的游乐场:https://play.golang.org/p/idQFFVjS-X
我正在尝试从 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 语言的新手,非常感谢任何建议。提前致谢!
有几件事我马上就注意到了:
您没有使用
time.Time
对象发送到您的yahooInfoObj
结构。您正在发送字符串您正在调用return "single value context" 多个值的函数。这意味着您只是希望忽略第二个值,但对于 Go 来说,这是您编码中的错误。您必须明确设置这些值。
您没有检查多个错误。始终检查错误 - 它会在将来防止 "gotchas"。
它并不完美,但这是一个看似有效的游乐场:https://play.golang.org/p/idQFFVjS-X