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

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

將可變長度數組從 csv 解析為結構體

將可變長度數組從 csv 解析為結構體

Go
藍山帝景 2023-08-14 15:10:43
我有以下設置來解析 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 回答

?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

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


查看完整回答
反對 回復 2023-08-14
  • 1 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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