英文:
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
// 读取CSV文件
result, _ := r.ReadAll()
// 遍历每个返回的统计数据(行)
for i := range result {
// 跳过第一个条目,因为返回的是列名
if i != 0 {
stat := result[i]
date, _ := time.Parse("2006-01-02", stat[0])
open, _ := strconv.ParseFloat(stat[1], 32)
high, _ := strconv.ParseFloat(stat[2], 32)
low, _ := strconv.ParseFloat(stat[3], 32)
close, _ := strconv.ParseFloat(stat[4], 32)
volume, _ := strconv.Atoi(stat[5])
adjClose, _ := strconv.ParseFloat(stat[6], 32)
stats = append(stats, yahooInfoObj{
date: date,
open: float32(open),
high: float32(high),
low: float32(low),
close: float32(close),
volume: volume,
adjClose: float32(adjClose),
})
}
}
return stats
}
这是一些示例数据,将返回并放入data
变量中:
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语言的新手,非常感谢任何建议。提前谢谢!
英文:
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!
答案1
得分: 1
我立即注意到几个问题:
-
你没有使用
time.Time
对象发送给yahooInfoObj
结构体,而是发送了一个字符串。 -
你在“单值上下文”中调用返回多个值的函数。这意味着你只是希望忽略第二个值,但对于Go语言来说,这是你的代码中的错误。你需要显式地设置这些值。
-
你没有检查多个错误。始终检查错误-这将防止将来出现“意外情况”。
这个示例可能不完美,但似乎可以工作:https://play.golang.org/p/idQFFVjS-X
英文:
There's a few things that I notice right off the bat:
-
You're not using a
time.Time
object to send to youryahooInfoObj
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论