func scanLines(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
}
// We have a line terminated by carriage return at the end of the buffer.
if !atEOF && len(data) == i+1 {
return 0, nil, 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
}
2条答案
按热度按时间shyt4zoc1#
您可以为
bufio.Scanner
编写自定义bufio.SplitFunc
。例如:像这样使用它:
vdgimpew2#
当我阅读一个旧的Mac生成的文件,只有CR行结束时,我遇到了一个边缘情况,如果CRLF被分割到缓冲区边界,可接受的答案会将它们视为单独的行结束符。如果缓冲区以CR结尾,你基本上需要提前退出并请求更多的数据。