2012-10-19 46 views
3

我正尝试使用GO附带的标准库“encoding/csv”写入到GO中的csv文件。但是,没有任何内容正在写入文件,并且没有错误返回。以下是编写代码。映射中的值是字符串数组。感谢您提前提供任何帮助。在GO中写入csv错误

func writeErrors() { 

    file, error := os.OpenFile("output.csv", os.O_APPEND|os.O_CREATE, 0666) 

    if error != nil {panic(error)} 
    defer file.Close() 

    // New Csv writer 
    writer := csv.NewWriter(file) 

    // Headers 
    var new_headers = []string { "group_id", "account_id", "location_id", "payment_rating", "records_with_error" } 
    returnError := writer.Write(new_headers) 
    if returnError != nil { 
     fmt.Println(returnError) 
    } 

    for key, value := range errors { 
     returnError := writer.Write(value) 
     if returnError != nil { 
      fmt.Println(returnError) 
     } 
     fmt.Println("Writing: ", key, value) 
    } 
} 
+0

为什么你需要'文件,错误:= os.OpenFile( “output.csv”,os.O_APPEND,0666)'行? – simonmenke

+0

我补充说,因为我需要能够追加到文件,并据我了解,当文件创建或打开它们设置为只读访问。 – amedeiros

+0

我想我可以添加| os.O_CREATE如果该文件不存在,并跳过创建它。 – amedeiros

回答

6

有一个额外的标志,如您呼叫os.OpenFile,而不是直接通过os.Create它通过为O_RDWR您。您需要将O_RDWR或O_WRONLY与您的O_APPEND |一起传递O_CREATE标志。

O_APPEND仅用于表示在写入时应将写入附加到文件的末尾,它不指定开放模式本身。

附加说明: 您正在使用“错误”作为变量名,这其实是在围棋一种,一般用于命名错误返回变量的成语是“犯错”

6

您需要调用writer.Flush()writer.Write()

//from package documentation 

func (w *Writer) Flush() 
Flush writes any buffered data to the underlying io.Writer.