亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將可變長度數組從 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 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號