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