Maison >développement back-end >Golang >Convertir la structure en chaîne CSV

Convertir la structure en chaîne CSV

王林
王林avant
2024-02-09 15:15:251304parcourir

将结构转换为 CSV 字符串

l'éditeur php Youzi vous présentera comment convertir la structure de données en chaîne CSV dans cet article. CSV (Comma Separated Values) est un format de fichier couramment utilisé pour stocker des données tabulaires. En convertissant la structure des données en chaîne CSV, vous pouvez facilement exporter les données vers d'autres outils tels qu'Excel pour le traitement et l'analyse. Dans cet article, nous explorerons les méthodes et techniques pour mettre en œuvre ce processus à l'aide du langage de programmation PHP. Que vous soyez un développeur débutant ou expérimenté, cet article vous fournira des conseils utiles et des exemples de code pour vous aider à accomplir facilement cette tâche.

Contenu de la question

J'ai une structure qui est analysée après que la base de données répond comme indiqué ci-dessous. Chaque champ est le même len(). Je veux prendre cette structure et générer une chaîne délimitée par CSV/

package main

import "fmt"

type data struct {
    id   []string
    col1 []float64
    col2 []float64
}

func main() {
    d := &data{
        id:   []string{"id_1", "id_1", "id_1", "id_1"},
        col1: []float64{340.384926, 321.385028, 520.341473, 500.385473},
        col2: []float64{123.285031, 4087.284675, -8958.284216, -7612.283668},
    }
    fmt.printf("%+v", d)
}

Je souhaite parcourir une structure que je pense pouvoir utiliser reflect, puis utiliser les noms de champs de structure comme en-têtes et les valeurs comme colonnes individuelles de cet en-tête pour construire une chaîne CSV comme celle ci-dessous, séparée par une virgule. .

`
id,col1,col2
id_1,340.384926,123.285031
id_1,321.385028,4087.284675
id_1,520.341473,-8958.284216
id_1,500.385473,-7612.283668
`

Quel est le moyen efficace d’y parvenir ?

Solution de contournement

Si possible, évitez d'utiliser des reflect 迭代结构体,因为它可能导致性能下降代码可读性降低。不要陷入 xy 问题 - 这里的要求是将 data 结构转换为 csv 字符串(y 问题),但这里的 x 问题是避免使用 data structures itératives car cela peut entraîner une dégradation des performances et une lisibilité du code. Ne tombez pas dans le problème xy

- l'exigence ici est de convertir les données structure en chaîne de caractères csv (problème y), mais le problème x ici est d'éviter d'utiliser des types structurels tels que data comme point de départ.

De nombreux packages Golang pour manipuler les fichiers CSV préfèrent :
  • [][]string : encodage/csv et struct2csv

  • []struct{} : gocsv et csv2struct

data类型不可避免,可以先编写一个函数,将data转换为[][]string,同时避免使用reflectCependant, si le type data est inévitable, vous pouvez d'abord écrire une fonction pour convertir data en

tout en évitant d'utiliser

 : encoding/csv 中的 w.writeall() 方法轻松将 [][]string

func transformdatato2dslice(d data) [][]string {

    numrows := len(d.id)
    result := make([][]string, numrows+1)

    // add header row
    result[0] = []string{"id", "col1", "col2"}

    // add data rows
    for i := 0; i < numrows; i++ {
        result[i+1] = []string{d.id[i],
            strconv.formatfloat(d.col1[i], 'f', -1, 64),
            strconv.formatfloat(d.col2[i], 'f', -1, 64),
        }
    }

    return result
}

Ensuite, utilisez la méthode w.writeall() dans encoding/csv pour convertir facilement

en csv

func main() {

    d := data{
        id:   []string{"id_1", "id_1", "id_1", "id_1"},
        col1: []float64{340.384926, 321.385028, 520.341473, 500.385473},
        col2: []float64{123.285031, 4087.284675, -8958.284216, -7612.283668},
    }

    d2dslice := transformdatato2dslice(d)

    // fmt.printf("%+v", d2dslice)
    // [[id, col1, col2],
    // [id_1, 340.384926, 123.285031],
    // [id_1, 321.385028, 4087.284675],
    // [id_1, 520.341473, -8958.284216],
    // [id_1,500.385473,-7612.283668]]

    w := csv.newwriter(os.stdout)
    w.writeall(d2dslice)

    if err := w.error(); err != nil {
        log.fatalln("error writing csv:", err)
    }

    // stdout:
    // id,col1,col2
    // id_1,340.384926,123.285031
    // id_1,321.385028,4087.284675
    // id_1,520.341473,-8958.284216
    // id_1,500.385473,-7612.283668
}
Exécutez le programme ci-dessus ici :

go-playground

🎜Pour écrire un csv dans une variable chaîne, transmettez le tampon : 🎜
buf := new(bytes.Buffer)
    w := csv.NewWriter(buf)
    w.WriteAll(d2dslice)

    if err := w.Error(); err != nil {
        log.Fatalln("error writing csv:", err)
    }

    csvString := buf.String()

    fmt.Printf("%T\n", csvString)  // print the variable type
    // string

    fmt.Printf("%+v\n", csvString) // print the variable value
    // id,col1,col2
    // id_1,340.384926,123.285031
    // id_1,321.385028,4087.284675
    // id_1,520.341473,-8958.284216
    // id_1,500.385473,-7612.283668

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer