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 套件更喜歡:
[][]string
:encoding/csv和 < a href="https://github.com/mohae/struct2csv" rel="nofollow noreferrer">struct2csv
[]struct{}
:gocsv和csv2struct
#但是,如果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中文網其他相關文章!