1 回答

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
一種可能的解決方案是將源文件閱讀器包裝在自定義閱讀器中,該閱讀器的Read(...)
方法會(huì)靜默地從底層閱讀器實(shí)際讀取的內(nèi)容中刪除尾隨空格。可以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>
}
請(qǐng)注意,這里有一個(gè)微妙的錯(cuò)誤,如果直到后續(xù)調(diào)用才讀取行終止符,尾隨空格仍然可以通過(guò)。您可以通過(guò)緩沖來(lái)解決問(wèn)題,或者最好是簡(jiǎn)單地預(yù)處理這些 CSV 文件以在嘗試解析它們之前刪除尾隨空格。
- 1 回答
- 0 關(guān)注
- 206 瀏覽
添加回答
舉報(bào)