2017-02-15 3 views
5
package main 

import (
    "bufio" 
    "encoding/csv" 
    "fmt" 
    "io" 
    "log" 
    "os" 
) 

func main() { 
    data, err := os.Open("cc.csv") 
    defer data.Close() 
    if err != nil { 
     log.Fatal(err) 
    } 

    s := bufio.NewScanner(data) 
    for s.Scan() { 
     fmt.Println(s.Text()) 
     if err := s.Err(); err != nil { 
      panic(err) 
     } 
    } 
    // Is it a proper way? 
    data.Seek(0, 0) 
    r := csv.NewReader(data) 

    for { 
     if record, err := r.Read(); err == io.EOF { 

      break 
     } else if err != nil { 
      log.Fatal(err) 
     } else { 
      fmt.Println(record) 
     } 

    } 
} 

Ich benutze zwei Leser hier, um aus einer CSV-Datei zu lesen. Zum Zurückspulen einer Datei verwende ich data.Seek(0, 0) ist es ein guter Weg? Oder es ist besser, die Datei zu schließen und vor dem zweiten Lesen wieder zu öffnen.Golang, eine richtige Möglichkeit zum Zurückspulen von Dateizeiger

Ist es auch richtig *File als io.Reader zu verwenden? Oder ist es besser r := ioutil.NewReader(data)

Antwort

9

Sucht an den Anfang der Datei zu tun, ist am einfachsten mit File.Seek(0, 0) getan wie Sie vorgeschlagen, aber nicht vergessen, dass:

Das Verhalten von Sucht auf eine Datei geöffnet mit O_APPEND ist nicht angegeben.

(Dies zu Ihrem Beispiel nicht jedoch gelten.)

die Zeiger auf den Anfang der Datei zu setzen ist die Datei immer viel schneller als zu schließen und wieder zu öffnen. Wenn Sie verschiedene, "kleine" Teile der Datei viele mal wechseln müssen, dann vielleicht könnte es profitabel sein, die Datei zweimal zu öffnen, um wiederholtes Suchen zu vermeiden (sorgen Sie sich nur, wenn Sie peformance Probleme haben).

Und wieder *os.File implementiert io.Reader, so dass Sie es als io.Reader verwenden können. Ich weiß nicht, was ioutil.NewReader(data) ist Sie in Ihrer Frage erwähnt (Paket io/ioutil hat keine solche Funktion; vielleicht meintest du bufio.NewReader()?), Aber sicherlich ist es nicht erforderlich, aus einer Datei zu lesen.

Verwandte Themen