gpt4 book ai didi

csv - 在 go 中导入数字 csv 数据的正确方法

转载 作者:IT王子 更新时间:2023-10-29 02:29:08 26 4
gpt4 key购买 nike

我想读取一个仅包含数值(带小数)的 csv 格式的文件,并将其存储在矩阵中,以便我可以对它们执行操作。该文件如下所示:

1.5、2.3、4.4
1.1、5.3、2.4
...

它可能有数千行和超过 3 列。

我使用 go csv 库解决了这个问题。这将创建一个 [][]string,然后我使用 for 循环将矩阵解析为 [][]float64

func readCSV(filepath string) [][]float64 {

csvfile, err := os.Open(filepath)
if err != nil {
return nil
}

reader := csv.NewReader(csvfile)
stringMatrix, err := reader.ReadAll()

csvfile.Close()

matrix := make([][]float64, len(stringMatrix))

//Parse string matrix into float64
for i := range stringMatrix {
matrix[i] = make([]float64, len(stringMatrix[0]))
for y := range stringMatrix[i] {
matrix[i][y], err = strconv.ParseFloat(stringMatrix[i][y], 64)
}
}

return matrix
}

我想知道这是否是一种正确且有效的方法,或者是否有更好的方法。

就像改用 reader.Read() 并在读取每一行时解析它一样。我不知道,但感觉我在做很多重复的工作。

最佳答案

这完全取决于您希望如何使用数据。您的代码在内存方面效率不高,因为您读取内存中的整个 CSV 内容 (stringMatrix),然后创建另一个变量来保存转换为 float64 的数据(matrix).因此,如果您的 CSV 文件大小为 1 GB,您的程序将为 stringMatrix 使用 1 GB 的 RAM + 为 matrix 使用更多内存。

您可以通过以下任一方式优化代码:

  • 逐行读取reader并将数据附加到matrix;您不需要一次将整个 stringMatrix 存入内存;
  • 逐行读取 reader 并逐行处理该数据。也许你不需要在内存中也有 matrix,也许你可以在读取数据时处理数据,而不是一次将所有内容都放在内存中。这取决于您程序的其余部分,取决于它需要如何使用 CSV 数据。

如果您使用上面的第二种方法,并且您不需要从该函数返回整个 CSV 数据,您的程序可以使用几个字节而不是千兆字节的 RAM。

关于csv - 在 go 中导入数字 csv 数据的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46225426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com