2011-05-26 81 views
8

在Go中執行readline字符串的習慣用法是什麼?標準庫中提供的原始函數看起來非常低,它們返回字節數組。有沒有更容易的方式從readline函數中獲取字符串?go readline - >字符串

+1

可能重複[逐行讀取文件中的文件](http://stackoverflow.com/questions/8757389/reading-file-line-by-line-in-go) – Malcolm 2014-04-16 14:08:32

回答

10

以下是一些使用bufio.ReadLinebufio.ReadString的示例。

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
) 

func ReadLine(filename string) { 
    f, err := os.Open(filename) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    defer f.Close() 
    r := bufio.NewReaderSize(f, 4*1024) 
    line, isPrefix, err := r.ReadLine() 
    for err == nil && !isPrefix { 
     s := string(line) 
     fmt.Println(s) 
     line, isPrefix, err = r.ReadLine() 
    } 
    if isPrefix { 
     fmt.Println("buffer size to small") 
     return 
    } 
    if err != io.EOF { 
     fmt.Println(err) 
     return 
    } 
} 

func ReadString(filename string) { 
    f, err := os.Open(filename) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    defer f.Close() 
    r := bufio.NewReader(f) 
    line, err := r.ReadString('\n') 
    for err == nil { 
     fmt.Print(line) 
     line, err = r.ReadString('\n') 
    } 
    if err != io.EOF { 
     fmt.Println(err) 
     return 
    } 
} 

func main() { 
    filename := `testfile` 
    ReadLine(filename) 
    ReadString(filename) 
} 
+0

謝謝,我希望有一個更多內置的方式來做到這一點。我很驚訝這個功能不是內置的。 – jz87 2011-05-28 04:04:58

+8

如果你今天看到這個,你會想用io.EOF代替os.EOF。 – oleks 2012-07-16 08:44:46

+0

...和'errors.New(...)'而不是'os.NewError(...)'和'NewReaderSize()'只返回一個參數。 – topskip 2012-08-17 19:54:46

11

我寫了一種方法來輕鬆讀取文件中的每一行。 Readln(* bufio.Reader)函數從底層bufio.Reader結構中返回一行(sans \ n)。

// Readln returns a single line (without the ending \n) 
// from the input buffered reader. 
// An error is returned iff there is an error with the 
// buffered reader. 
func Readln(r *bufio.Reader) (string, error) { 
    var (isPrefix bool = true 
     err error = nil 
     line, ln []byte 
    ) 
    for isPrefix && err == nil { 
     line, isPrefix, err = r.ReadLine() 
     ln = append(ln, line...) 
    } 
    return string(ln),err 
} 

您可以使用Readln從文件中讀取每一行。以下代碼讀取文件中的每一行並將每行輸出到stdout。

f, err := os.Open(fi) 
if err != nil { 
    fmt.Println("error opening file= ",err) 
    os.Exit(1) 
} 
r := bufio.NewReader(f) 
s, e := Readln(r) 
for e == nil { 
    fmt.Println(s) 
    s,e = Readln(r) 
} 

乾杯!

+4

這是偉大的,但使用append是非常糟糕的。如果將該行切換爲複製(ln,line),則該函數的運行速度將提高約20倍。這對我來說是必須的,因爲我解析了很多GB的文件。 – mschuett 2015-05-05 05:45:33

+2

@mschuett你能分享修改過的代碼嗎? – 2016-10-04 17:33:20

相關問題