2015-05-25 73 views
1

我正在嘗試改編bufio.ScanLines,因此它意識到已逃脫的新行\\nbufio.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.ScanLinesbufio.SplitFunc,只要它返回以轉義字符結尾的令牌,然後返回組合的令牌,就可以組合令牌。

鑑於第一種方法的尺寸和簡單性,我可能會這麼做。第二種方法可能最終結束時間更長,效率更低,並且可能需要狀態,因爲當返回(0, nil, nil)以要求更多輸入時,您需要存儲組合令牌。

另一個解決方案是實現一個Transformer(從golang.org/x/text/transform包)從輸入條相關轉義字符(如刪除"\\\n"),並使用transform.NewReader,使過濾閱讀器,你會然後做不過你想要使用(例如通過bufio.Scanner與常規ScanLines)。

在任何情況下,您都可以從scan_test.go複製相應的測試,併爲逃脫的換行符添加自己的行爲。謹防bufio.MaxScanTokenSize