我一直在编写一个使用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。我认为我做的事情很奇怪。但是,我不能为我的生活看到它。