为了账号安全,请及时绑定邮箱和手机立即绑定

迄今为止的 CSV 和浮动

迄今为止的 CSV 和浮动

Go
SMILET 2023-06-05 19:44:44
我目前正在编写一个小程序,将 CSV 文件转换为用于进一步处理的结构。csv 行看起来像这样20140102,09:30,38.88,38.88,38.82,38.85,67004我有 500 个文件,每个大约 20-30 MB。我的代码工作得很好,但我不禁想知道是否有比我现在正在做的更好的方法来转换这些文件。首先读取文件并转换为csv记录(伪代码)    data, err := ioutil.ReadFile(path)    if err != nil {        ...     }    r := csv.NewReader(bytes.NewReader(data))    records, err := r.ReadAll()    if err != nil {        ...     }然后遍历所有记录并做    parsedTime, err := time.Parse("2006010215:04", record[0]+record[1])    if err != nil {        return model.ZorroT6{}, time.Time{}, err    }    t6.Date = ConvertToOle(parsedTime)    if open, err := strconv.ParseFloat(record[2], 32); err == nil {        t6.Open = float32(open)    }    if high, err := strconv.ParseFloat(record[3], 32); err == nil {        t6.High = float32(high)    }    if low, err := strconv.ParseFloat(record[4], 32); err == nil {        t6.Low = float32(low)    }    if close, err := strconv.ParseFloat(record[5], 32); err == nil {        t6.Close = float32(close)    }    if vol, err := strconv.ParseInt(record[6], 10,32); err == nil {        t6.Vol = int32(vol)    }例如,我必须通过 []byte -> string -> float64 -> float32 来获取我的浮点值。我可以做些什么来改进这段代码?编辑:要明确一点,我真的不需要提高性能,我只是更好地尝试了解 Go 以及可以应用于此类问题的性能优化。例如,当我有一个字节切片并想要一个 float32 时,创建大量字符串和 float64 似乎有很多开销。
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我发现只有一个问题需要解决:

不要ioutil.ReadFile与一起使用bytes.NewReader。它将所有内容读入内存,当文件很大时效率低下。

相反,使用os.Open(file),它完美地提供了一个io.Reader可以csv.NewReader利用的。不要忘记关闭文件并处理错误。

如果您仍想提高性能:

  1. 由于您的 csv 文件是固定格式的,因此可以使用原始字节bufio代替csv.

  2. 您可以复制并粘贴底层代码strconvtime以避免不需要的通用代码。

但我认为他们不值得麻烦。


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信