我有一堆IP范围或单个地址。我想出了如何遍历它们,可以将它们成功打印到控制台。但是,当我将相同的数据写入CSV时,它会神奇地在每个值之后添加一个逗号(而不是将它们全部添加在由空格分隔的同一标头下)。我遵循了所有规则(无论如何,看起来还是如此)来在Go中添加数据,但是我无法弄清楚为什么它不起作用。我假设Go中的CSV函数只是看到一个空格,并认为应该用逗号分隔。
其中的input
部分正在遍历[]string
类型的地址。因此,一个值可以是127.0.0.1 - 127.0.0.255
或仅仅是127.0.0.1
。我只希望它们在csv列Included
中是这样的:127.0.0.1 - 127.0.0.255 127.0.0.1
我希望示例CSV看起来像这样:
这是我现在正在使用的代码。如果需要更多,请告诉我,但这就是我将数据写入CSV的方式。
func ToCsv(inputs []interface{}, output io.Writer) {
w := csv.NewWriter(output)
defer w.Flush()
if len(inputs) == 0 {
return
} else {
// Get Header
r := reflect.ValueOf(inputs[0])
val := reflect.Indirect(reflect.ValueOf(inputs[0]))
var headers []string
for i := 0; i < r.NumField(); i++ {
headers = append(headers, val.Type().Field(i).Name)
}
w.Write(headers)
// Get Content
for _, input := range inputs {
ri := reflect.ValueOf(input)
var result []string
for i := 0; i < ri.NumField(); i++ {
switch ri.Field(i).Interface().(type) {
case []string:
//this is the part that's looping through all the ip addresses and is causing me a headache
stringArray := ri.Field(i).Interface().([]string)
for ii := 0; ii < len(stringArray); ii++ {
stringArray[ii] = strings.Replace(stringArray[ii], " ", ":", -1)
result = append(result,stringArray[ii])
}
case bool:
result = append(result, strconv.FormatBool(ri.Field(i).Interface().(bool)))
case int32:
result = append(result, strconv.FormatInt(int64(ri.Field(i).Interface().(int32)), 10))
case []int32:
intArray := ri.Field(i).Interface().([]int32)
for ii := 0; ii < len(intArray); ii++ {
result = append(result, strconv.FormatInt(int64(intArray[ii]),10))
}
case string:
result = append(result, ri.Field(i).Interface().(string))
default:
result = append(result, "")
}
}
w.Write(result)
}
}
}
答案 0 :(得分:0)
为了不使用逗号即可获取数据输出,
csv阅读器具有一个名为Comma
的变量,该变量设置用于分隔csv中的值的字节。
csv读取器和写入器也是如此。
对于带有逗号以外的csv数据,您需要分别设置Comma
读写器变量。
package main
import (
"encoding/csv"
"os"
"strings"
)
func main() {
// temporary csv
sr := strings.NewReader(
`"name" "value"
"nilsocket" "7"
"nil" "77"
`)
// set your src of csv
r := csv.NewReader(sr)
r.Comma = ' ' // set this if your values were seperated
// with anything other than ','(comma)
res, _ := r.ReadAll() // read csv, res is going to be [][]string type
// you can fetch one record with r.Read()
// don't forget to check for errors
w := csv.NewWriter(os.Stdout) // set your dst for csv
w.Comma = ' ' // set the Comma byte to space
w.WriteAll(res) // write csv
w.Flush() // don't forget to flush
}