2017-01-02 3 views
3

Как читать строки из файла, в котором окончанием строки являются возврат каретки (CR), новая строка (NL) или и то, и другое?Чтение строк из файла с переменными строками строк в Go

Спецификация PDF позволяет линиям заканчиваться CR, LF или CRLF.

  • bufio.Reader.ReadString() и bufio.Reader.ReadBytes() позволяют один разделитель байт.

  • bufio.Scanner.Scan() обрабатывает \n необязательно предшествует \r, но не одинокий \r.

    Маркер конца строки является одним необязательным возвратом каретки, за которым следует одна обязательная строка новой строки.

Мне нужно написать свою собственную функцию, которая использует bufio.Reader.ReadByte() ли?

+5

Вы можете написать свою собственную функцию разделения для использования с 'Scanner', разделяющей линии в манере, которую вы описали. См. Https://golang.org/pkg/bufio/#Scanner.Split. –

ответ

3

Вы можете написать на заказ bufio.SplitFunc по номеру bufio.Scanner. Например:

// 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) 
Смежные вопросы