2015-05-25 7 views
1

Я пытаюсь адаптировать bufio.ScanLines, так что он знает о беглых линиях \\n.bufio.ScanLines с экранированными новыми линиями

Входной сигнал:

line1 \ 
continues on line2 

Ожидаемые результаты:

["line1 continues on line2"] 

В данный момент выход bufio.ScanLines (см пример кода ниже) является:

["line1 \\", "continues on line2"] 

Пример кода:

s := bufio.NewScanner(f) 
s.Split(bufio.ScanLines) 

for s.Scan() { 
    fmt.Println(s.Text()) 
} 

Что было бы лучшим подходом здесь? Ищете реализацию, которая все еще проходит тесты в https://golang.org/src/bufio/scan_test.go.

+0

Что такое 'f' в вашем коде? –

+0

Также у вас есть 'line1 \\' в выводе, если вход имеет только 'line1 \'? –

+0

'f, err: = os.Open (filename)' – mattes

ответ

-1

Несколько очевидных подходов приходят на ум.

Прежде всего, взгляните на source for bufio.ScanLines, он невелик, и вы можете легко реализовать свой собственный bufio.SplitFunc с нуля, начиная с копии этого измененного, чтобы делать то, что вы хотите.

Во-вторых, вы можете написать bufio.SplitFunc, который вызвал bufio.ScanLines в цикле, комбинируя токены, пока он возвращает те, которые заканчиваются в вашем escape-символе, а затем возвращают комбинированный токен.

Учитывая короткий размер и простоту первого подхода, это то, что я, вероятно, сделаю. Второй подход, скорее всего, закончится так же долго, будет менее эффективным и, вероятно, потребует состояния, так как вам нужно будет хранить комбинированный токен-так-далеко, возвращая (0, nil, nil), чтобы запросить дополнительный ввод.

Другим решением было бы реализовать Transformer (от golang.org/x/text/transform пакета), который удаляет соответствующие экранированные символы из входного сигнала (например, удаляет "\\\n") и использовать transform.NewReader сделать фильтрованную читателю, что вы тогда же использовать, как вы (например, переходя к bufio.Scanner с обычным ScanLines).

В любом случае вы можете скопировать соответствующие тесты с scan_test.go, а также добавить свои собственные для поведения с экранированной новой строкой. Опасайтесь bufio.MaxScanTokenSize.

Смежные вопросы