Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tukar struktur kepada rentetan CSV

Tukar struktur kepada rentetan CSV

王林
王林ke hadapan
2024-02-09 15:15:251262semak imbas

将结构转换为 CSV 字符串

editor php Youzi akan memperkenalkan anda tentang cara menukar struktur data kepada rentetan CSV dalam artikel ini. CSV (Comma Separated Values) ialah format fail yang biasa digunakan untuk menyimpan data jadual. Dengan menukar struktur data kepada rentetan CSV, anda boleh mengeksport data dengan mudah ke alat lain seperti Excel untuk pemprosesan dan analisis. Dalam artikel ini, kita akan meneroka kaedah dan teknik untuk melaksanakan proses ini menggunakan bahasa pengaturcaraan PHP. Sama ada anda seorang pemula atau pembangun yang berpengalaman, artikel ini akan memberikan anda panduan berguna dan contoh kod untuk membantu anda menyelesaikan tugas ini dengan mudah.

Kandungan soalan

Saya mempunyai struktur yang diimbas selepas pangkalan data bertindak balas seperti yang ditunjukkan di bawah. Setiap medan adalah sama len(). Saya mahu mengambil struktur ini dan menjana rentetan dibatasi 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)
}

Saya ingin mengulangi struktur yang saya rasa boleh saya gunakan reflect dan kemudian gunakan nama medan struktur sebagai pengepala dan nilai sebagai lajur individu pengepala itu untuk membina rentetan csv seperti di bawah, dipisahkan dengan koma .

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

Apakah cara yang berkesan untuk mencapai matlamat ini?

Penyelesaian

Jika boleh, elakkan menggunakan reflect 迭代结构体,因为它可能导致性能下降代码可读性降低。不要陷入 xy 问题 - 这里的要求是将 data 结构转换为 csv 字符串(y 问题),但这里的 x 问题是避免使用 data struktur berulang kerana ia boleh mengakibatkan kemerosotan prestasi dan kebolehbacaan kod. Jangan terlibat dalam masalah xy

- keperluan di sini adalah untuk menukar data struktur ke dalam rentetan aksara csv (masalah y), tetapi masalah x di sini adalah untuk mengelak daripada menggunakan jenis struktur seperti data sebagai titik permulaan.

Banyak pakej golang untuk memanipulasi csv lebih suka:
  • [][]string: pengekodan/csv dan struct2csv

  • []struct{}: gocsv dan csv2struct

data类型不可避免,可以先编写一个函数,将data转换为[][]string,同时避免使用reflectWalau bagaimanapun, jika jenis data tidak dapat dielakkan, anda boleh menulis fungsi untuk menukar data kepada

dahulu sambil mengelak daripada menggunakan

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

Seterusnya, gunakan kaedah w.writeall() dalam encoding/csv untuk menukar

kepada csv dengan mudah

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
}
Jalankan program di atas di sini:

go-playground

🎜Untuk menulis csv kepada pembolehubah rentetan, masukkan penimbal: 🎜
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

Atas ialah kandungan terperinci Tukar struktur kepada rentetan CSV. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam