568 Stimmen

Lesen einer Datei Zeile für Zeile in Go

Ich kann nicht finden file.ReadLine Funktion in Go.

Wie kann man eine Datei Zeile für Zeile lesen?

9 Stimmen

Ab Go1.1 ist bufio.Scanner die beste Möglichkeit, dies zu tun.

13voto

lzap Punkte 15420

Sie können ReadString auch mit \n als Trennzeichen:

  f, err := os.Open(filename)
  if err != nil {
    fmt.Println("error opening file ", err)
    os.Exit(1)
  }
  defer f.Close()
  r := bufio.NewReader(f)
  for {
    path, err := r.ReadString(10) // 0x0A separator = newline
    if err == io.EOF {
      // do something here
      break
    } else if err != nil {
      return err // if you return error
    }
  }

0 Stimmen

Welche Kodierung wird für die Umwandlung der Bytes in eine Zeichenkette verwendet?

8voto

pythoner Punkte 77

Eine andere Methode ist die Verwendung der io/ioutil y strings Bibliotheken, um die gesamten Bytes der Datei zu lesen, sie in eine Zeichenkette umzuwandeln und sie mit einem " \n " (Zeilenumbruch) als Begrenzungszeichen, zum Beispiel:

import (
    "io/ioutil"
    "strings"
)

func main() {
    bytesRead, _ := ioutil.ReadFile("something.txt")
    file_content := string(bytesRead)
    lines := strings.Split(file_content, "\n")
}

Technisch gesehen lesen Sie die Datei nicht Zeile für Zeile, aber Sie können mit dieser Technik jede Zeile analysieren. Diese Methode ist für kleinere Dateien geeignet. Wenn Sie versuchen, eine große Datei zu analysieren, verwenden Sie eine der Techniken, die Zeile für Zeile lesen.

9 Stimmen

Die gesamte Datei auf diese Weise in den Speicher zu lesen und dann zu explodieren, kann bei großen Dateien wahnsinnig teuer werden.

2 Stimmen

os.ReadFile() scheint das Gleiche zu tun.

6voto

kroisse Punkte 515

bufio.Reader.ReadLine() funktioniert gut. Wenn Sie aber jede Zeile als Zeichenkette lesen wollen, versuchen Sie es mit ReadString(' \n ') . Sie muss das Rad nicht neu erfinden.

4voto

cyber Punkte 59
// strip '\n' or read until EOF, return error if read error  
func readline(reader io.Reader) (line []byte, err error) {   
    line = make([]byte, 0, 100)                              
    for {                                                    
        b := make([]byte, 1)                                 
        n, er := reader.Read(b)                              
        if n > 0 {                                           
            c := b[0]                                        
            if c == '\n' { // end of line                    
                break                                        
            }                                                
            line = append(line, c)                           
        }                                                    
        if er != nil {                                       
            err = er                                         
            return                                           
        }                                                    
    }                                                        
    return                                                   
}

2voto

zuzuleinen Punkte 2399

Im unten stehenden Code lese ich die Interessen aus der CLI, bis der Benutzer die Eingabetaste drückt, und ich verwende Readline:

interests := make([]string, 1)
r := bufio.NewReader(os.Stdin)
for true {
    fmt.Print("Give me an interest:")
    t, _, _ := r.ReadLine()
    interests = append(interests, string(t))
    if len(t) == 0 {
        break;
    }
}
fmt.Println(interests)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X