Heim  >  Artikel  >  Backend-Entwicklung  >  Konvertieren Sie die Struktur in eine CSV-Zeichenfolge

Konvertieren Sie die Struktur in eine CSV-Zeichenfolge

王林
王林nach vorne
2024-02-09 15:15:251208Durchsuche

将结构转换为 CSV 字符串

php-Editor Youzi stellt Ihnen in diesem Artikel vor, wie Sie die Datenstruktur in einen CSV-String konvertieren. CSV (Comma Separated Values) ist ein häufig verwendetes Dateiformat zum Speichern tabellarischer Daten. Durch die Konvertierung der Datenstruktur in einen CSV-String können Sie die Daten zur Verarbeitung und Analyse bequem in andere Tools wie Excel exportieren. In diesem Artikel werden wir die Methoden und Techniken zur Implementierung dieses Prozesses mithilfe der Programmiersprache PHP untersuchen. Unabhängig davon, ob Sie Anfänger oder erfahrener Entwickler sind, bietet Ihnen dieser Artikel hilfreiche Anleitungen und Beispielcode, damit Sie diese Aufgabe problemlos bewältigen können.

Frageninhalt

Ich habe eine Struktur, die gescannt wird, nachdem die Datenbank wie unten gezeigt antwortet. Jedes Feld ist das gleiche len(). Ich möchte diese Struktur nehmen und eine durch CSV getrennte Zeichenfolge/

generieren
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)
}

Ich möchte eine Struktur durchlaufen, die ich meiner Meinung nach verwenden kann reflect, und dann die Strukturfeldnamen als Header und die Werte als einzelne Spalten dieses Headers verwenden, um eine CSV-Zeichenfolge wie die folgende zu erstellen, getrennt durch Kommas .

`
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
`

Was ist ein effektiver Weg, dies zu erreichen?

Problemumgehung

Vermeiden Sie nach Möglichkeit die Verwendung reflect 迭代结构体,因为它可能导致性能下降代码可读性降低。不要陷入 xy 问题 - 这里的要求是将 data 结构转换为 csv 字符串(y 问题),但这里的 x 问题是避免使用 data iterativer Strukturen, da dies zu Leistungseinbußen und Codelesbarkeit führen kann. Fallen Sie nicht in das xy-Problem

– die Anforderung besteht darin, die Datenzu konvertieren > Struktur in CSV-Zeichenfolge (y-Problem), aber das x-Problem besteht hier darin, die Verwendung von Strukturtypen wie data als Ausgangspunkt zu vermeiden.

Viele Golang-Pakete zum Bearbeiten von CSV bevorzugen:
  • [][]string: encoding/csv und struct2csv

  • []struct{}: gocsv und csv2struct

data类型不可避免,可以先编写一个函数,将data转换为[][]string,同时避免使用reflectWenn jedoch der Typ data unvermeidbar ist, können Sie zunächst eine Funktion schreiben, um data in

umzuwandeln und dabei die Verwendung von

zu vermeiden: 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
}

Als nächstes verwenden Sie die Methode w.writeall() in encoding/csv, um

einfach in CSV zu konvertieren

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
}
Führen Sie das obige Programm hier aus:

go-playground

🎜Um eine CSV-Datei in eine String-Variable zu schreiben, übergeben Sie den Puffer: 🎜
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

Das obige ist der detaillierte Inhalt vonKonvertieren Sie die Struktur in eine CSV-Zeichenfolge. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen