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

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

Go 中的 CSV 解析器由于尾隨空格而中斷

Go 中的 CSV 解析器由于尾隨空格而中斷

Go
慕婉清6462132 2023-04-04 17:17:12
我們正在嘗試使用 Go 的 encoding/csv 包解析 csv 文件。這個特殊的 csv 有點特殊,每一行都有一個尾隨空格。當嘗試使用帶引號的字段解碼此 csv 時,包會中斷,因為它需要換行符、分隔符或引號。尾隨空格不是預期的。你會如何處理這個案子?您知道我們可以使用的另一個解析器嗎?編輯:f,err := os.Open("file.go")// err etc..csvr := csv.NewReader(f)csvr.Comma = csvDelimiterfor {   rowAsSlice, err := csvr.Read()   // Handle row and errors etc.}編輯 2:CSV 示例,注意尾隨空格!"RECORD_TYPE","COMPANY_SHORTNAME" "HDR","COMPANY_EXAMPLE" 
查看完整描述

1 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

一種可能的解決方案是將源文件閱讀器包裝在自定義閱讀器中,該閱讀器的Read(...)方法會靜默地從底層閱讀器實際讀取的內容中刪除尾隨空格。可以csv.Reader直接使用該類型。

例如:

type TrimReader struct{ io.Reader }


var trailingws = regexp.MustCompile(` +\r?\n`)


func (tr TrimReader) Read(bs []byte) (int, error) {

? // Perform the requested read on the given reader.

? n, err := tr.Reader.Read(bs)

? if err != nil {

? ? return n, err

? }


? // Remove trailing whitespace from each line.

? lines := string(bs[:n])

? trimmed := []byte(trailingws.ReplaceAllString(lines, "\n"))

? copy(bs, trimmed)

? return len(trimmed), nil

}


func main() {

? file, err := file.Open("myfile.csv")

? // TODO: handle err...


? csvr := csv.NewReader(TrimReader{file})


? for {

? ? record, err := csvr.Read()

? ? if err == io.EOF {

? ? ? break

? ? }

? ? fmt.Printf("LINE: record=%#v, err=%v\n", record, err)

? }

? // LINE: record=[]string{"RECORD_TYPE", "COMPANY_SHORTNAME"}, err=<nil>

? // LINE: record=[]string{"HDR", "COMPANY_EXAMPLE"}, err=<nil>

}

請注意,這里有一個微妙的錯誤,如果直到后續調用才讀取行終止符,尾隨空格仍然可以通過。您可以通過緩沖來解決問題,或者最好是簡單地預處理這些 CSV 文件以在嘗試解析它們之前刪除尾隨空格。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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