2017-02-15 7 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) 
     } 

    } 
} 

私はここで2人の読者を使ってcsvファイルを読む。 ファイルを巻き戻すには、data.Seek(0, 0)を使用するのが良い方法ですか?または、ファイルを閉じて2回目の読み込みを行う前に再度開く方が良いでしょう。ゴールン、ファイルポインタを巻き戻す適切な方法

*Fileio.Readerとしても使用できますか?それともそれは最も簡単なあなたが示唆しただけのようFile.Seek(0, 0)を使用して行われ、ファイルの先頭に探しているr := ioutil.NewReader(data)

答えて

9

を行うには良いでしょうが、それを忘れないでください:

ファイル上のシークの行動O_APPENDで開か指定されていません。

(これはしかし、あなたの例には適用されません。)

ファイルの先頭にポインタを設定し、常にファイルを閉じて再度開くよりもはるかに高速です。 複数の異なる小さな部分を読む必要がある場合は、回、次にのように、ファイルを2回開いて繰り返し検索するのを避けることができます(問題が発生した場合のみ心配してください)。

さらに*os.Fileio.Readerを実装しているため、io.Readerとして使用できます。私はioutil.NewReader(data)あなたの質問(パッケージio/ioutilにそのような機能はありません;たぶんあなたはbufio.NewReader()を意味したのだろうか?)で述べたことは分かりませんが、確かにそれはファイルから読む必要はありません。