首頁  >  文章  >  後端開發  >  將結構轉換為 CSV 字串

將結構轉換為 CSV 字串

王林
王林轉載
2024-02-09 15:15:251208瀏覽

将结构转换为 CSV 字符串

php小編柚子在這篇文章中將為您介紹如何將資料結構轉換為CSV字串。 CSV(逗號分隔值)是常用的文件格式,用於儲存表格資料。透過將資料結構轉換為CSV字串,您可以方便地將資料匯出到Excel等其他工具進行處理和分析。在本文中,我們將探討使用PHP程式語言來實現此過程的方法和技巧。無論您是初學者還是有經驗的開發人員,本文都將為您提供有用的指導和範例程式碼,幫助您輕鬆地完成此任務。

問題內容

我有一個在資料庫回應後被掃描的結構,如下所示。每個欄位都是相同的len()。我想採用這個結構並產生一個 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)
}

我想循環遍歷我認為可以使用reflect 的結構,然後使用結構字段名稱作為標題,將值作為該標題的各個列,構造一個如下所示的csv 字符串,由a分隔逗號。

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

實現這目標的有效方法是什麼?

解決方法

如果可能,請避免使用reflect 迭代結構體,因為它可能導致效能下降程式碼可讀性降低。不要陷入xy 問題 - 這裡的要求是將data 結構轉換為csv 字串(y 問題),但這裡的x 問題是避免使用data 等結構類型作為起點。

許多操作 csv 的 golang 套件更喜歡:

#但是,如果data類型不可避免,可以先寫一個函數,將data轉換為[][]string,同時避免使用reflect

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
}

接下來,使用 encoding/csv 中的 w.writeall() 方法輕鬆將 [][]string 轉換為 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
}

在此處運行上面的程式:go-playground

#要將 csv 寫入字串變量,請傳入緩衝區:

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

以上是將結構轉換為 CSV 字串的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除