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) 
     } 

    } 
} 

Я использую здесь два считывателя для чтения из файла csv. Чтобы перемотать файл, я использую data.Seek(0, 0), это хороший способ? Или лучше закрыть файл и открыть его перед вторым чтением.Golang, правильный способ перемотки указателя файла

Правильно ли использовать *File как io.Reader? Или это лучше сделать r := ioutil.NewReader(data)

ответ

9

Стремясь к началу файла проще всего сделать с помощью File.Seek(0, 0) так же, как вы предложили, но не стоит забывать, что:

Поведение Ищи на открытый файл с O_APPEND не указывается.

(Это не относится к вашему примеру, хотя.)

Установка указатель на начало файла всегда намного быстрее, чем закрытие и повторное открытие файла. Если вам нужно прочитать разные «маленькие» части файла , многие из раз, чередующиеся, то возможно может оказаться выгодным открыть файл дважды, чтобы избежать повторных поисков (беспокоиться об этом, только если у вас проблемы с формированием).

И снова *os.File реализует io.Reader, поэтому вы можете использовать его как io.Reader. Я не знаю, что ioutil.NewReader(data) вы упомянули в своем вопросе (пакет io/ioutil не имеет такой функции, может быть, вы имели в виду bufio.NewReader()?), Но, конечно, не нужно читать из файла.

Смежные вопросы