如何读取行结尾为回车符(CR),换行符(NL)或两者的文件中的行?
PDF规范允许行以CR,LF或CRLF结束。
bufio.Reader.ReadString()
和bufio.Reader.ReadBytes()
允许使用单个分隔符字节。
bufio.Scanner.Scan()
处理\n
可选地\r
前面,但不是\r
。
行尾标记是一个可选的回车符,后跟一个强制换行符。
我是否需要编写自己使用bufio.Reader.ReadByte()
的函数?
答案 0 :(得分:3)
您可以为bufio.SplitFunc
撰写自定义bufio.Scanner
。 E.g:
// Mostly bufio.ScanLines code:
func ScanPDFLines(data []byte, atEOF bool) (advance int, token []byte, err error) {
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := bytes.IndexAny(data, "\r\n"); i >= 0 {
if data[i] == '\n' {
// We have a line terminated by single newline.
return i + 1, data[0:i], nil
}
advance = i + 1
if len(data) > i+1 && data[i+1] == '\n' {
advance += 1
}
return advance, data[0:i], nil
}
// If we're at EOF, we have a final, non-terminated line. Return it.
if atEOF {
return len(data), data, nil
}
// Request more data.
return 0, nil, nil
}
并使用它:
scan := bufio.NewScanner(r)
scan.Split(ScanPDFLines)