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

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

將 csv 讀入 [][]byte

將 csv 讀入 [][]byte

Go
慕標5832272 2023-03-21 10:20:02
當我將 csv 文件讀入二維字節切片時,我遇到了一些奇怪的行為。前 42 行很好,之后似乎將額外的行結尾放入數據中,這會弄亂事情:前42次第一排:row 0: 504921600000000000,truck_0,South,Trish,H-2,v2.3,1500,150,12,52.31854,4.72037,124,0,221,0,25添加 43 行后的第一行:row 0: 504921600000000000,truck_49,South,Andy,F-150,v2.0,2000,200,15,38.9349,179.94282,289,0,269,0row 1: 25重現問題的最少代碼:package mainimport (    "bufio"    "log"    "os")type fileDataSource struct {    scanner *bufio.Scanner}type batch struct {    rows [][]byte}func (b *batch) Len() uint {    return uint(len(b.rows))}func (b *batch) Append(row []byte) {    b.rows = append(b.rows, row)    for index, row := range b.rows {        log.Printf("row %d: %s\n", index, string(row))    }    if len(b.rows) > 43 {        log.Fatalf("asdf")    }}type factory struct{}func (f *factory) New() *batch {    return &batch{rows: make([][]byte, 0)}}func main() {    file, _ := os.Open("/tmp/data1.csv")    scanner := bufio.NewScanner(bufio.NewReaderSize(file, 4<<20))    b := batch{}    for scanner.Scan() {        b.Append(scanner.Bytes())    }}我希望行 [][]byte 逐行包含 csv 數據
查看完整描述

2 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

正如已經建議的那樣,您真的應該考慮使用encoding/csv.

也就是說,您的問題的原因在函數上方的 godocBytes()中進行了解釋:

// Bytes returns the most recent token generated by a call to Scan.

// The underlying array may point to data that will be overwritten

// by a subsequent call to Scan. It does no allocation.

func (s *Scanner) Bytes() []byte {

    return s.token

}

因此,返回的字節切片可能會被后續調用修改Scan()。為避免這種情況,您需要復制字節切片,例如


for scanner.Scan() {

    row := scanner.Bytes()

    bs := make([]byte, len(row))

    copy(bs, row)

    b.Append(bs)

}


查看完整回答
反對 回復 2023-03-21
?
嗶嗶one

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

您需要創建 返回的數據的副本Bytes。


https://pkg.go.dev/[email protected]#Scanner.Bytes


Bytes 返回調用 Scan 生成的最新標記。底層數組可能指向將被后續調用 Scan 覆蓋的數據。它沒有分配。


for scanner.Scan() {

    row := make([]byte, len(scanner.Bytes()))

    copy(row, scanner.Bytes())

    b.Append(row)

}

https://go.dev/play/p/Lqot-wOXiwh


查看完整回答
反對 回復 2023-03-21
  • 2 回答
  • 0 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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