Go Web 資料儲存 2 CSV檔案

2021-09-07 20:38:50 字數 3276 閱讀 3698

關於csv檔案的說明,見csv檔案格式

下面是持久化到csv檔案的函式**:

func storetocsv(filename string, posts map[int]*post) 

defer csvfile.close()

// 獲取csv的writer

writer := csv.newwriter(csvfile)

// 將map中的post轉換成slice,因為csv的write需要slice引數

// 並寫入csv檔案

for _, post := range posts

err1 := writer.write(record)

if err1 != nil

}// 確保所有記憶體資料刷到csv檔案

writer.flush()

}

這個函式的邏輯很簡單,無需過多的解釋。需要注意的是,os.create()函式在檔案存在時會截斷檔案,如有需要,可以考慮使用追加寫入的相關函式。

當需要將儲存在記憶體中的post儲存到csv檔案時,只需呼叫該函式,傳遞乙個檔名以及postbyid作為引數即可:

storetocsv("d:/a.csv", postbyid)
儲存之後,以下是a.csv檔案的內容:

2,hello 2,userb

3,hello 3,userc

4,hello 4,usera

1,hello 1,usera

資料儲存到了csv檔案,自然需要從csv檔案中讀取資料到記憶體。以下是讀取csv檔案的函式:

func load(filename string) *post 

defer file.close()

// 獲取csv的reader

reader := csv.newreader(file)

// 設定fieldsperrecord為-1

reader.fieldsperrecord = -1

// 讀取檔案中所有行儲存到slice中

records, err := reader.readall()

if err != nil

var posts *post

// 將每一行資料儲存到記憶體slice中

for _, item := range records

}return posts

}

邏輯也很簡單,唯一需要注意的是filedsperrecord=-1

這個load()函式返回乙個slice,這個slice中儲存了所有讀取到的文章指標。

s := load("d:/a.csv")
因為使用var postbyid map[int]*postvar postsbyauthor map[string]*post儲存一篇篇的文章,迭代此slice即可將slice中的post儲存到這兩個map中。

for _, post := range s
然後就可以從這兩個map中按照id或者按照author進行檢索:

fmt.println(postbyid[1])

fmt.println(postbyid[2])

for _, post := range postsbyauthor["usera"]

下面是完整的儲存到csv檔案以及讀取csv檔案的**:

package main

import (

"encoding/csv"

"fmt"

"os"

"strconv"

)type post struct

var postbyid map[int]*post

var postsbyauthor map[string]*post

func store(post *post)

func storetocsv(filename string, posts map[int]*post)

defer csvfile.close()

writer := csv.newwriter(csvfile)

for _, post := range posts

err1 := writer.write(record)

if err1 != nil

}writer.flush()

}func load(filename string) *post

defer file.close()

reader := csv.newreader(file)

reader.fieldsperrecord = -1

records, err := reader.readall()

if err != nil

var posts *post

for _, item := range records

}return posts

}func main()

post2 := &post

post3 := &post

post4 := &post

// 儲存到記憶體中

store(post1)

store(post2)

store(post3)

store(post4)

// 將記憶體中的map容器,儲存到csv檔案中

storetocsv("d:/a.csv", postbyid)

// 為了測試,此處將已儲存在記憶體中的資料清空

postbyid = map[int]*post{}

postsbyauthor = map[string]*post{}

// 下面是載入csv檔案

s := load("d:/a.csv")

for _, post := range s

// 檢索

fmt.println(postbyid[1])

fmt.println(postbyid[2])

for _, post := range postsbyauthor["usera"]

for _, post := range postsbyauthor["userc"]

}

執行結果:

&&&

&&

Go Web 資料儲存 2 CSV檔案

關於csv檔案的說明,見csv檔案格式 下面是持久化到csv檔案的函式 func storetocsv filename string,posts map int post defer csvfile.close 獲取csv的writer writer csv.newwriter csvfile 將...

4 locust 引數化2 csv 檔案處理

1 csv 根據傳入列名生成 list or queue import osimport csvimport queue csv 檔案中的指定列生成乙個 queue csv 檔案位置 csvfile mobile test1.csvfile defcsv to queue file path,par...

CSV檔案儲存

csv檔案儲存 csv,全稱為 comma separated vaules,翻譯為逗號分隔值或字元分隔值,其檔案以純文字形式儲存 資料。該檔案是乙個字串行,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由欄位組成,字段之間的分隔符是字串或其他字元,最常見的是逗號或製表符。不過所有記錄都...