始终引用csv值

时间:2014-01-24 03:57:14

标签: csv go

我想引用CSV文档中的所有字段。有没有办法修改golang的csv模块而无需复制所有代码?在另一种语言中,我只是继承csv.Writer并覆盖fieldNeedsQuotes,但这在Go中是不可能的,或者是吗?

2 个答案:

答案 0 :(得分:1)

我知道,这是一个古老的问题。但是我最近遇到了同样的问题,并通过扩展Golang的altcsv创建了一个小型库encoding/csv

如果其他人对此有疑问,则可以使用以下库: https://github.com/tushar2708/altcsv

它与现有CSV库向后兼容。我计划将来在同一接口中添加更多类似python的CSV接口。

从CSV文件读取:

fileRdr, _ = os.Open("/tmp/custom_csv_file.txt")
csvRdr := altcsv.NewReader(fileRdr)
content := csvReader.ReadAll()

写入CSV文件:

headers = []string{"hero_name", "alter_ego", "identity"}
fileWtr, _ := os.Create("/tmp/all_quotes_csv_file.txt")
csvWtr := altcsv.NewWriter(csvH)
csvWtr.AllQuotes = true   // surround each field with '"'
csvWtr.Write(headers)
csvWtr.Write([]string{"Spider-Man", "Peter Parker", "Secret Identity"})
csvWtr.Write([]string{"Captain America", "Steven Rogers", "Public Identity"})
csvWtr.Write([]string{"Thor", "Thor Odinson", "No dual Identity"})
csvWtr.Flush()
fileWtr.Close()

答案 1 :(得分:-1)

Matt和Volker已经说过你可以复制模块并对其进行修改。

您也可以使用Writer包装器,但我认为它有点复杂。 将我的尝试视为概念证明(不得使用*)。

type quoteWriter struct {
    w io.Writer
}

func (w quoteWriter) Write(p []byte) (n int, err error) {
    q := make([]byte, 0)
    quoted := true
    quoted = (p[0] == '"')
    if !quoted {
        //begin field quote
        q = append(q, '"')
    }

    for i, v := range p {
        //We check the "quotation" status for new field or line
        //This is a simplification
        if v == ',' || v == '\n' {
            if !quoted { //end field quote
                q = append(q, '"')
            }
            //copy current byte
            q = append(q, v)

            //is next byte quote?
            if len(p) > i+1 {
                quoted = (p[i+1] == '"')
            }
            if !quoted { //begin field quote
                q = append(q, '"')
            }
        } else {
            q = append(q, v)
        }
    }

    return w.w.Write(q)
}

请参阅以下来自csv#Writer测试(http://golang.org/src/pkg/encoding/csv/writer_test.go)的示例,并应用了概念证明:

http://play.golang.org/p/wovYUkt6Vq

不使用* 请注意,我没有检查过所有情况,例如,如果逗号在引用文本中,则需要检查并调整它。 我还建议复制和修改csv包。