將結構轉換為 CSV 字串

王林
發布: 2024-02-09 15:15:25
轉載
1178 人瀏覽過

将结构转换为 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 套件更喜歡:

  • [][]string:encoding/csv和 < a href="https://github.com/mohae/struct2csv" rel="nofollow noreferrer">struct2csv

  • []struct{}gocsvcsv2struct

#但是,如果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
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!