从Go中带有可变行结尾的文件中读取行

时间:2017-01-02 21:20:43

标签: go

如何读取行结尾为回车符(CR),换行符(NL)或两者的文件中的行?

PDF规范允许行以CR,LF或CRLF结束。

  • bufio.Reader.ReadString()bufio.Reader.ReadBytes()允许使用单个分隔符字节。

  • bufio.Scanner.Scan()处理\n可选地\r前面,但不是\r

      

    行尾标记是一个可选的回车符,后跟一个强制换行符。

我是否需要编写自己使用bufio.Reader.ReadByte()的函数?

1 个答案:

答案 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)