關於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]*post
和var 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,翻譯為逗號分隔值或字元分隔值,其檔案以純文字形式儲存 資料。該檔案是乙個字串行,可以由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由欄位組成,字段之間的分隔符是字串或其他字元,最常見的是逗號或製表符。不過所有記錄都...