英文:
Convert generic csv to xml in Go
问题
我正在尝试将通用的CSV文件转换为XML文件。CSV文件有一行标题。标题值表示元素名称,相应列中的值是相应的元素值。
到目前为止,我的方法是:
// 读取CSV文件
file, err := os.Open(*i)
if err != nil {
log.Fatalf("打开输入文件时出错:%v\n", err)
}
defer file.Close()
r := csv.NewReader(file)
r.Comma, _ = utf8.DecodeRuneInString(*s)
lines, err := r.ReadAll()
// 标题值
header := lines[0]
// 写入XML文件
fileOut, err := os.Create(*o)
if err != nil {
log.Fatalf("打开输出文件时出错:%v\n", err)
}
defer fileOut.Close()
for _, l := range lines {
for i, elem := range l {
// TODO: 这里缺少一些内容...
xml.EscapeText(fileOut, []byte(header[i]))
xml.EscapeText(fileOut, []byte(elem))
}
问题:如何使XML写入部分的最后一部分工作?或者有没有更高效的方法将CSV文件转换为XML文件?
英文:
I am trying to convert generic csv files into xml files. The csv file has a header line. The header values represent the element name, and the values in the respective column are the corresponding element values.
My approach so far:
// Read the csv file
file, err := os.Open(*i)
if err != nil {
log.Fatalf("Error opening input file: %v\n", err)
}
defer file.Close()
r := csv.NewReader(file)
r.Comma, _ = utf8.DecodeRuneInString(*s)
lines, err := r.ReadAll()
// header values
header := lines[0]
// Write the xml file
fileOut, err := os.Create(*o)
if err != nil {
log.Fatalf("Error opening input file: %v\n", err)
}
defer fileOut.Close()
for _, l := range lines {
for i, elem := range l {
// TODO: Something here is missing...
xml.EscapeText(fileOut, []byte(header[i]))
xml.EscapeText(fileOut, []byte(elem))
}
Question: How do I make it the last part in xml write section work? Or is there a more efficient way of converting csv files into xml files?
答案1
得分: 1
有两种解决方案:
- 如果你能获取到结构体、字段和标签,你可以将数据反射到一个结构体中,然后使用xml包中的方法输出XML。
- 但是,如果像我所面临的情况一样,你不知道结构体的具体信息,有一种愚蠢但简单的方法,就是将数据以字符串的形式写入,如下所示:
data := XML_HEADER
data = data + "<records>\n"
for i := 2; i < len(records); i++ {
data = data + " <record "
for j := 0; j < len(records[i]); j++ {
data = data + head[j] + `="` + records[i][j] + `" `
}
data = data + "/>\n"
}
data = data + "</records>"
ioutil.WriteFile(xmlFileName, []byte(data), 0644)
以上是翻译好的内容,请确认是否满意。
英文:
The are two solutions:
You can reflect the data into a struct,only when you can get the struct , fields and tags. then output XML by methods from xml package.
But,if you don't know the struct as I face.there is a stupid but easy way,writing as string, as blow:
data := XML_HEADER
data = data + "<records>\n"
for i := 2; i < len(records); i++ {
data = data + " <record "
for j := 0; j < len(records[i]); j++ {
data = data + head[j] + `="` + records[i][j] + `" `
}
data = data + "/>\n" }
data = data + "</records>"
ioutil.WriteFile(xmlFileName, []byte(data), 0644)
答案2
得分: 0
Go语言内置了对CSV和XML的读写支持。
请查看以下包:
http://golang.org/pkg/encoding/csv/
http://golang.org/pkg/encoding/xml/
将CSV数据读入结构体,然后将XML输出到文件应该没有问题。
英文:
Go has built in support for reading and writing CSV and XML.
Checkout the following packages:
http://golang.org/pkg/encoding/csv/
http://golang.org/pkg/encoding/xml/
It should be no problem to read your CSV data into a struct and then output XML to a file
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论