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 文件以在嘗試解析它們之前刪除尾隨空格。
- 1 回答
- 0 關注
- 185 瀏覽
添加回答
舉報