从csv文件加载矩阵 - golang

时间:2017-05-29 21:19:00

标签: arrays csv matrix go

我正在编写一个对矩阵执行数学运算的程序。我想从csv文件加载它们并具有以下代码:

    file, err := os.Open("matrix1.csv")
if err != nil {
    log.Fatal(err)
}
defer file.Close()
lines, _ := csv.NewReader(file).ReadAll()
for i, line := range lines {
    for j, val := range line {
        valInt, err := strconv.Atoi(val)
        if err != nil {
            log.Fatal(err)
        }
        matrix1[i][j] = valInt
    }
}

然而,strconv代码抛出错误:

strconv.ParseInt: parsing "": invalid syntax

似乎代码中的其他所有内容都是正确的,有没有人对如何解决此错误有任何想法?

编辑:我现在正在尝试将结果输出到新的csv文件。

我有以下代码:

    file2, err := os.Create("result.csv")
if err != nil {
    log.Fatal(err)
}
defer file1.Close()

writer := csv.NewWriter(file2)
for line2 := range blank {
    writer.Write(line2)
}

}

}

这会出现以下错误:

 cannot use line2 (type int) as type []string in argument to writer.Write

更新了评论中的建议,但现在可以看到上述错误。

2 个答案:

答案 0 :(得分:1)

这意味着您的CSV的一个单元格为空白,我使用以下代码重现了错误:

package main

import (
    "encoding/csv"
    "log"
    "strconv"
    "strings"
)

func main() {
    matrix1 := [5][5]int{}

    file := strings.NewReader("1,2,3,4,5\n6,7,8,,0")
    lines, _ := csv.NewReader(file).ReadAll()
    for i, line := range lines {
        for j, val := range line {
            valInt, err := strconv.Atoi(val)
            if err != nil {
                log.Fatal(err)
            }
            matrix1[i][j] = valInt
        }
    }
}

如果您可以将空白单元格视为0,那么这将使您超越错误:

func main() {
    matrix1 := [5][5]int{}

    file := strings.NewReader("1,2,3,4,5\n6,7,8,,0")
    lines, _ := csv.NewReader(file).ReadAll()
    for i, line := range lines {
        for j, val := range line {
            var valInt int
            var err error
            if val == "" {
                valInt = 0
            } else {
                valInt, err = strconv.Atoi(val)
            }
            if err != nil {
                log.Fatal(err)
            }
            matrix1[i][j] = valInt
        }
    }
}

答案 1 :(得分:0)

正如上面评论中提到的,错误是由于我的csv文件中缺少值。

修改文件后,错误现在消失了。