Необходимо добавить данные в CSV без добавления запятой к данным - PullRequest
0 голосов
/ 01 октября 2018

У меня есть куча диапазонов IP-адресов или отдельных адресов.Я разобрался, как их прокрутить, я могу успешно распечатать их на консоли.Однако когда я записываю одни и те же данные в CSV, он волшебным образом добавляет запятую после каждого значения (вместо того, чтобы добавлять их под одним заголовком, разделенным пробелом).Я следую всем правилам (ну, по-видимому, в любом случае) при добавлении данных в Go, но я просто не могу понять, почему это не работает.Я предполагаю, что функция CSV в Go просто видит пробел и думает, что она должна быть разделена запятой.

Часть этого 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 голосов
/ 01 октября 2018

Чтобы получить вывод данных без запятой, у csv reader есть переменная, известная как Comma, которая устанавливает байт, который разделяет значения в csv.

То же самое касается обоих csv readerи Writer.

Для данных 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...