从已知良好的csv文件中获取EOF

时间:2015-07-31 22:09:33

标签: csv go

我一直在编写一个使用encoding / csv包解析csv文件的程序。出于某种原因,我厌倦了零星的EOF错误。这很奇怪,因为我使用相同的文件来反复测试。有时它解析得很好。其他时候它以EOF退出。

这是代码的简化版本:

main.go

package main

import (
    "bytes"
    "encoding/csv"
    "fmt"
    "os"
    "path/filepath"
    "unicode/utf8"
)

func main() {
    LoadConfig()
    csvfile, err := os.Open(config.MonitorDir + "/test.csv")
    if err != nil {
        fmt.Println(err)
        os.Exit(2)
    }

    reader := csv.NewReader(csvfile)
    defer func() {
        csvfile.Close()
        MoveFile(csvfile)
    }()
    reader.Comma, _ = utf8.DecodeRuneInString(config.Delimiter)
    reader.LazyQuotes = true
    writeHeaders(reader)
}

func writeHeaders(reader *csv.Reader) {
  Headers, err := reader.Read() // This is where I see the EOF 
                                // (Headers = [] err = EOF)
  if err != nil {
      fmt.Printf("Error is: %s\n", err.Error())
      os.Exit(2)
  }
  fmt.Println(Headers)
}

func MoveFile(file *os.File) {
    err := os.MkdirAll(Concat(config.MonitorDir, "/completed/"), os.ModeDir)
    if err != nil {
        fmt.Printf("Error is: %s\n", err.Error())
        os.Exit(2)
    }
    err = os.Rename(file.Name(), Concat(config.MonitorDir, "/completed/", filepath.Base(file.Name())))

    if err != nil {
        return
    }
}

func Concat(str ...string) string {
    var buffer bytes.Buffer

    for i := 0; i < len(str); i++ {
        buffer.WriteString(str[i])
    }
    return buffer.String()
}

conf.go

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

type Configuration struct {
    MonitorDir string
    LogPath    string
    Delimiter  string
}

var config Configuration

func LoadConfig() {
    file, _ := os.Open("conf.json")
    decoder := json.NewDecoder(file)
    config = Configuration{}
    err := decoder.Decode(&config)
    if err != nil {
        fmt.Printf("Error is: %s\n", err.Error())
        os.Exit(2)
    }
}

test.csv

Id,LastModified
"108420","2015-04-25T11:34:35.437332096-06:00"
"132774","2015-04-25T11:34:35.437332096-06:00"
"254790","2015-04-25T11:34:35.437332096-06:00"
"359972","2015-04-25T11:34:35.437332096-06:00"
"363060","2015-04-25T11:34:35.437332096-06:00"

这已成为阻塞问题,因为在最终处理文件之前它可能会抛出8,10或甚至更多的EOF。我认为我做的事情很奇怪。但是,我不能为我的生活看到它。

0 个答案:

没有答案