本文共 4416 字,大约阅读时间需要 14 分钟。
数据的收集与组织(例题中的代码链接)
1.使用go语言进行数据组织与处理的好处: 保证数据结果的完整性 利用共go语言的静态类型和明确的错误处理方式,确保数据的解析和期望的一致1.2Go语言收集和组织数据的最佳实践
1.检查并强制指定期望类型 2.标准化和简化数据输入/输出 3.数据的版本控制 1.3读取CSV文件的方式 1.使用encoding包中的csv库函数来读取 2.使用第三方包 github.com/kniren/gota/dataframe 来读取 type CSVRecord struct { SepalLength float64 SepalWidth float64 Petalength float64 PetalWidth float64 Speices string ParseError error }func main() {
// 打开文件 f, err := os.Open(“D:/gocode/iris.csv”) if err != nil { log.Fatal(err) } defer f.Close()// 读取文件/* 如果FieldsPerRecord大于0,Read方法要求每条记录都有给定数目的字段。 如果FieldsPerRecord等于0,Read方法会将其设为第一条记录的字段数,因此其余的记录必须有同样数目的字段。 如果FieldsPerRecord小于0,不会检查字段数,允许记录有不同数量的字段。*/reader := csv.NewReader(f)reader.FieldsPerRecord = 5// 读取所有的数据// rawCsvData, err := reader.ReadAll()// if err != nil {// log.Fatal(err)// }// 保证正确性// var rawCsvData [][]string// 定义切片数组 用来存储对象var csvData []CSVRecordfor { // 读取文件 record, err := reader.Read() if err == io.EOF { break } // 定义接收数据的对象 var csvrecord CSVRecord // 便利或缺每一行记录中的的各个域的值 for idx, value := range record { if idx == 4 { // 缺失域的情况 if value == "" { log.Printf("unexpected type in column %d\n ", idx) csvrecord.ParseError = fmt.Errorf("enpty string value ") break } csvrecord.Speices = value continue } var floatValue float64 if floatValue, err = strconv.ParseFloat(value, 64); err != nil { log.Printf("unexpected tyoe in column %d \n ", idx) csvrecord.ParseError = fmt.Errorf("Could not parse float") break } switch idx { case 0: csvrecord.SepalLength = floatValue case 1: csvrecord.SepalWidth = floatValue case 2: csvrecord.Petalength = floatValue case 3: csvrecord.PetalWidth = floatValue } } if csvrecord.ParseError == nil { csvData = append(csvData, csvrecord) }}for _, v := range csvData { fmt.Println(v)}
}
注意:使用第三种方式需要将第三方包中的文件go get获取 或者手动获取获取之后再调用过程中还需要再下载gonum包 引文gota中的某一个文件使用gonum包中的一个函数 所以需要下载gonum获取地址是 "gonum.org/v1/gonum/stat"3.数据可以读取后存入数组切片中 也可以新建结构体 存储到结构体中
1.3.1用数据帧操作CSV数据
1.使用第三方包dataframe来创建数据帧 优势:数据帧和相应功能非常适合表格数据集合的过滤、求子集和数据部分选择。 func main() { irisFile, err := os.Open(“D:/gocode/iris.csv”) if err != nil { log.Fatal(err) } defer irisFile.Close() irisDF := dataframe.ReadCSV(irisFile) fmt.Println(irisDF) filter := dataframe.F{ Colname: “species”, Comparator: “==”, Comparando: “Iris-versicolor”, } versicolorDf := irisDF.Filter(filter) if versicolorDf.Err != nil { log.Fatal(versicolorDf.Err) }}
1.4操作JSON数据
net包定位页面数据 ioutil包读取和保存数据,json包反序列化与序列化转化数据的格式 // 导入数据的路径 const citiBikeURL = “https://gbfs.citibikenyc.com/gbfs/en/station_status.json”// JSON数据的格式转换
type stationData struct { LastUpdated intjson:"lastuodated"
TTL int json:"ttl"
Data struct { Stations []station json:"stations"
} json:"data"
} type station struct {
ID stringjson:"station_id"
NumBikesAvailable int json:"num_bikes_available"
NumBikesDisabled int json:"num_bikes_disabled"
NumDocksAvailable int json:"num_docks_available"
NumDocksDisabled int json:"num_docks_disabled"
IsInstalled int json:"is_installed"
IsRenting int json:"is_renting"
IsReturning int json:"is_returning"
LastReported int json:"last_reported"
HasAvailableKeys bool json:"eightd_has_available_keys"
} func main() {
// 从网址获取数据response, err := http.Get(citiBikeURL)if err != nil { log.Fatal(err)}defer response.Body.Close()// 将网址中的数据格式转换body, err := ioutil.ReadAll(response.Body)if err != nil { log.Fatal(err)}// 声明实例存储数据var sd stationData// 反序列化if err := json.Unmarshal(body, &sd); err != nil { log.Fatal(err)}fmt.Printf("%+v\n\n", sd.Data.Stations[1])// 反序列化后将数据存入outputData, err := json.Marshal(&sd)if err != nil { log.Fatal(err)}// 将数据存储到本地if err := ioutil.WriteFile("citiBike.json", outputData, 0644); err != nil { log.Fatal(err)}
}
1.5文中使用的是Postgress数据库 我使用的是mysql数据库
1.使用到了"github.com/go-sql-driver/mysql"这个包 自行下载看API手册即可 import ( “database/sql” “fmt”_ "github.com/go-sql-driver/mysql"
)
var (
DB *sql.DB err error )func init() {
DB, err = sql.Open(“mysql”, “root:root@/flowerdb”) if err != nil { panic(err.Error()) } }func checkErr(err error) {
if err != nil { panic(err) } }func main() {
stmt, err := DB.Prepare(“SELECT * FROM iris where Slength =?”) checkErr(err) rows, err := stmt.Query(“100”) checkErr(err) for rows.Next() { var year string var month string var day string var thing string var money string err := rows.Scan(&year, &month, &day, &thing, &money) checkErr(err) fmt.Println(year, month, day, money, thing) } defer DB.Close() defer stmt.Close() defer rows.Close() }转载地址:http://bgydi.baihongyu.com/