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 关注
- 131 浏览
添加回答
举报