需要将数据添加到CSV而不向数据添加逗号

时间:2018-10-01 01:18:42

标签: csv go

我有一堆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

数据如何在控制台中显示的屏幕截图(正确): enter image description here

CSV的屏幕截图(不正确): enter image description here

我希望示例CSV看起来像这样:

enter image description here

这是我现在正在使用的代码。如果需要更多,请告诉我,但这就是我将数据写入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)
        }
    }
}

1 个答案:

答案 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
}