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

将可变长度数组从 csv 解析为 struct

将可变长度数组从 csv 解析为 struct

Go
繁星coding 2022-04-26 14:08:59
我有以下设置来解析 csv 文件:package mainimport (    "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 项目生成的。)帮助/建议表示赞赏。
查看完整描述

1 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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]}


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

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