将可变长度数组从 csv 解析为结构体

我有以下设置来解析 csv 文件:


package main


import (

    "fmt"

    "os"

    "encoding/csv"

)


type CsvLine struct {

    Id string

    Array1 [] string

    Array2 [] string

}



func ReadCsv(filename string) ([][]string, error) {


    f, err := os.Open(filename)

    if err != nil {

        return [][]string{}, err

    }

    defer f.Close()


    lines, err := csv.NewReader(f).ReadAll()

    if err != nil {

        return [][]string{}, err

    }

    return lines, nil

}



func main() {


    lines, err := ReadCsv("./data/sample-0.3.csv")

    if err != nil {

        panic(err)

    }


    for _, line := range lines {

                fmt.Println(line)

        data := CsvLine{

            Id: line[0],

            Array1: line[1],

            Array2: line[2],

        }

        fmt.Println(data.Id)

        fmt.Println(data.Array1)

        fmt.Println(data.Array2)

    }

}

我的 csv 文件中有以下设置:


594385903dss,"['fhjdsk', 'dfjdskl', 'fkdsjgooiertio']","['jflkdsjfl', 'fkjdlsfjdslkfjldks']"

87764385903dss,"['cxxc', 'wqeewr', 'opi', 'iy', 'qw']","['cvbvc', 'gf', 'mnb', 'ewr']"


我的理解是,可变长度列表应该解析为切片,是否可以直接通过 csv 阅读器来执行此操作?(csv 输出是通过 python 项目生成的。)


感谢帮助/建议。


蓝山帝景
浏览 91回答 1
1回答

幕布斯7119047

CSV没有“可变长度数组”的概念,它只是一个以逗号分隔的值列表。RFC 4180中描述了该格式,这正是该encoding/csv包所实现的。您只能从 CSV 行中获取字符串切片。如何解释这些价值观取决于您。如果您想进一步拆分数据,则必须对数据进行后处理。您所拥有的内容可以简单地与regexp包一起处理,例如var r = regexp.MustCompile(`'[^']*'`)func split(s string) []string {    parts := r.FindAllString(s, -1)    for i, part := range parts {        parts[i] = part[1 : len(part)-1]    }    return parts}测试它:s := `['one', 'two', 'three']`fmt.Printf("%q\n", split(s))s = `[]`fmt.Printf("%q\n", split(s))s = `['o,ne', 't,w,o', 't,,hree']`fmt.Printf("%q\n", split(s))输出(在Go Playground上尝试):["one" "two" "three"][]["o,ne" "t,w,o" "t,,hree"]使用此split()函数,处理可能如下所示:for _, line := range lines {    data := CsvLine{        Id:     line[0],        Array1: split(line[1]),        Array2: split(line[2]),    }    fmt.Printf("%+v\n", data)}输出(在Go Playground上尝试):{Id:594385903dss Array1:[fhjdsk dfjdskl fkdsjgooiertio] Array2:[jflkdsjfl fkjdlsfjdslkfjldks]} {Id:87764385903dss Array1:[cxxc wqeewr opi iy qw] Array2:[cvbvc gf mnb ewr]}
打开App,查看更多内容
随时随地看视频慕课网APP