use*_*059 0 csv string go slice
我有以下设置来解析 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)
}
}
Run Code Online (Sandbox Code Playgroud)
我的 csv 文件中的以下设置:
594385903dss,"['fhjdsk', 'dfjdskl', 'fkdsjgooiertio']","['jflkdsjfl', 'fkjdlsfjdslkfjldks']"
87764385903dss,"['cxxc', 'wqeewr', 'opi', 'iy', 'qw']","['cvbvc', 'gf', 'mnb', 'ewr']"
Run Code Online (Sandbox Code Playgroud)
我的理解是可变长度列表应该被解析成一个切片,是否可以直接通过 csv 阅读器来做到这一点?(csv 输出是通过 python 项目生成的。)
帮助/建议表示赞赏。
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
}
Run Code Online (Sandbox Code Playgroud)
测试它:
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))
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上试试):
["one" "two" "three"]
[]
["o,ne" "t,w,o" "t,,hree"]
Run Code Online (Sandbox Code Playgroud)
使用这个split()函数,这就是处理的样子:
for _, line := range lines {
data := CsvLine{
Id: line[0],
Array1: split(line[1]),
Array2: split(line[2]),
}
fmt.Printf("%+v\n", data)
}
Run Code Online (Sandbox Code Playgroud)
此输出(在Go Playground上尝试):
{Id:594385903dss Array1:[fhjdsk dfjdskl fkdsjgooiertio] Array2:[jflkdsjfl fkjdlsfjdslkfjldks]}
{Id:87764385903dss Array1:[cxxc wqeewr opi iy qw] Array2:[cvbvc gf mnb ewr]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |