1. csv plugins,自带极简

1.1 写数据到csv文件

知识点:encoding/csv 库的 Write 方法使用[]string的切片格式追加方式写入数据

1.1.1 追加写入

package main

import (
"encoding/csv"
"fmt"
"log"
"os" "github.com/spf13/cast"
) type User struct {
ID int64
Name string
Tel string
Addr string
} func StructToCsv(filename string, UsersDb []User) {
newFile, err := os.Create(filename)
if err != nil {
fmt.Println(err)
}
defer func() {
newFile.Close()
}()
// 写入UTF-8
newFile.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM,防止中文乱码
// 写数据到csv文件
w := csv.NewWriter(newFile)
header := []string{"ID", "Name", "Tel", "Addr"} //标题 w.Write(header)
for _, v := range UsersDb {
context := []string{
cast.ToString(v.ID),
v.Name,
v.Tel,
v.Addr,
}
// data = append(data, context)
w.Write(context)
} if err := w.Error(); err != nil {
log.Fatalln("error writing csv:", err)
}
w.Flush()
}
func main() {
Users1 := []User{
{1, "admin", "adminTel", "adminAddr"},
{2, "test", "testTel", "testAddr"},
}
StructToCsv("user.csv", Users1) }

1.1.2 一次性写入

WriteAll 使用[][] [][]string 格式一次性写入数据,覆盖 csv 文件

package main

import (
"encoding/csv"
"fmt"
"os" "github.com/spf13/cast"
) type User struct {
ID int
Name string
Tel string
Addr string
} func StructToCsv(filename string, UsersDb []User) {
newFile, err := os.Create(filename)
if err != nil {
fmt.Println(err)
}
defer func() {
newFile.Close()
}()
// 写入UTF-8
newFile.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM,防止中文乱码
// 写数据到csv文件
w := csv.NewWriter(newFile)
header := []string{"ID", "Name", "Tel", "Addr"} //标题
data := [][]string{
header,
}
for _, v := range UsersDb {
context := []string{
cast.ToString(v.ID),
v.Name,
v.Tel,
v.Addr,
}
data = append(data, context)
}
w.WriteAll(data) // WriteAll方法使用Write方法向w写入多条记录,并在最后调用Flush方法清空缓存。 w.Flush()
}
func main() {
Users1 := []User{
{1, "admin", "adminTel", "adminAddr"},
{2, "test", "testTel", "testAddr"},
}
StructToCsv("user.csv", Users1) }

1.1.3 执行结果

ID,Name,Tel,Addr
1,admin,adminTel,adminAddr
2,test,testTel,testAddr

1.2 读取 csv 文件

1.2.1 Read,逐条读取为[]string格式的数据

package main

import (
"encoding/csv"
"fmt"
"io"
"log"
"os" "github.com/spf13/cast"
) type User struct {
ID int
Name string
Tel string
Addr string
} var Users []*User func CsvToDb(filename string) {
f, err := os.Open(filename)
if err != nil {
fmt.Println("Error: ", err)
} reader := csv.NewReader(f)
result1 := make([][]string, 0)
result2 := make([][]string, 0)
for {
record, err := reader.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
result1 = append(result1, record)
} for k, _ := range result1 {
if result1[k][1] == "Name" && result1[k][2] == "Tel" && result1[k][3] == "Addr" {
result2 = append(result1[:k], result1[k+1:]...)
}
}
for _, v := range result2 {
user := &User{
ID: cast.ToInt(v[0]),
Name: v[1],
Addr: v[2],
Tel: v[3],
}
Users = append(Users, user)
} for _, v := range Users {
fmt.Println(v)
}
} func main() {
CsvToDb("user.csv")
}

1.2.2 ReadAll,一次性读取为[][]string格式的数据

package main

import (
"encoding/csv"
"fmt"
"os" "github.com/spf13/cast"
) type User struct {
ID int
Name string
Tel string
Addr string
} var Users []*User func CsvToDb(filename string) {
f, err := os.Open(filename)
if err != nil {
fmt.Println("Error: ", err)
} reader := csv.NewReader(f) // 可以一次性读完
result, err := reader.ReadAll()
if err != nil {
fmt.Println("Error: ", err)
} result1 := make([][]string, 0)
for k, _ := range result {
if result[k][1] == "Name" && result[k][2] == "Tel" && result[k][3] == "Addr" {
result1 = append(result[:k], result[k+1:]...)
}
}
for _, v := range result1 {
user := &User{
ID: cast.ToInt(v[0]),
Name: v[1],
Addr: v[2],
Tel: v[3],
}
Users = append(Users, user)
} for _, v := range Users {
fmt.Println(v)
}
} func main() {
CsvToDb("user.csv")
}

2. github.com/gocarina/gocsv

简单案例:

package main

import (
"fmt"
"os" "github.com/gocarina/gocsv"
) type Client struct { // Our example struct, you can use "-" to ignore a field
ID string `csv:"ID"`
Name string `csv:"Name"`
Tel string `csv:"Tel"`
Addr string `csv:"-"`
} // type Client struct { // Our example struct, you can use "-" to ignore a field
// ID string "ID"
// Name string "Name"
// Tel string "Tel"
// Addr string "-"
// } func main() {
clientsFile, err := os.OpenFile("user.csv", os.O_RDWR|os.O_CREATE, os.ModePerm)
if err != nil {
panic(err)
}
defer clientsFile.Close() clients := []*Client{} if err := gocsv.UnmarshalFile(clientsFile, &clients); err != nil { // Load clients from file
panic(err)
}
for _, client := range clients {
fmt.Println("Hello", client.Name)
} if _, err := clientsFile.Seek(0, 0); err != nil { // Go to the start of the file
panic(err)
} clients = append(clients, &Client{ID: "12", Name: "John", Tel: "21"}) // Add clients
clients = append(clients, &Client{ID: "13", Name: "Fred"})
clients = append(clients, &Client{ID: "14", Name: "James", Tel: "32"})
clients = append(clients, &Client{ID: "15", Name: "Danny"})
csvContent, err := gocsv.MarshalString(&clients) // Get all clients as CSV string
//err = gocsv.MarshalFile(&clients, clientsFile) // Use this to save the CSV back to the file
if err != nil {
panic(err)
}
fmt.Println(csvContent) // Display all clients as CSV string }

执行结果:

 ~/Documents/projects/scripts/go/eg  cat user.csv
ID,Name,Tel,Addr
1,admin,adminTel,adminAddr
2,test,testTel,testAddr
~/Documents/projects/scripts/go/eg  go run 2.go
Hello admin
Hello test
ID,Name,Tel
,admin,adminTel
,test,testTel
12,John,21
13,Fred,
14,James,32
15,Danny,

【Golang】基础-操作 csv 文件的更多相关文章

  1. Python数据分析基础——读写CSV文件

    1.基础python代码: #!/usr/bin/env python3 # 可以使脚本在不同的操作系统之间具有可移植性 import sys # 导入python的内置sys模块,使得在命令行中向脚 ...

  2. 用javacsv API 来操作csv文件

    javacsv是国外开发的一个比较好的操作csv文件的API,这里简单讲一下用法. 先下载javacsv2.0.zip的文件,解压后,把javacsv.jar 添加到项目中.  本站下载地址: htt ...

  3. C#操作.csv文件Demo

    1.使用OleDB操作.csv文件,比较费时 public static DataTable GetDataTableFromCsv(string path,bool isFirstRowHeader ...

  4. java操作csv文件之javacsv.jar应用

    csv文件是分隔文件,如果使用java的io流来写,比较麻烦,这里为大家提供一个javacsv的jar包,这个很方便操作csv文件. 下载地址:https://pan.baidu.com/s/1i46 ...

  5. java 操作 csv文件

    CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...

  6. python中操作csv文件

    python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...

  7. springbatch操作CSV文件

    一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...

  8. Python操作csv文件

    1.什么是csv文件 The so-called CSV (Comma Separated Values) format is the most common import and export fo ...

  9. CsvReader和CsvWriter操作csv文件

    使用方法: 提供把实例数据输出到磁盘csv文件的功能 提供读取csv文件,并封装成指定实例的功能 小工具自己依赖了slf4j+logbak,以及fastJson,如果与系统冲突,可以在pom文件中去除 ...

随机推荐

  1. Gym102012G Rikka with Intersections of Paths

    题意 \(T\) 组数据,每组数据给定一棵 \(n\) 个点的树和 \(m\) 条路径,求选出 \(k\) 条给定路径使得至少有两条交于一点的方案数,对 \(10^9+7\) 取模. \(\textt ...

  2. mysql报错10061和10038

    用navicat连接报错10038,用sqlyog报错10061,又去查看服务,发现服务丢失 经过一系列的查阅资料,用下面的方式解决了问题 1.用管理员的方式打开命令行窗口 2.进入mysql的bin ...

  3. PLC模拟量采集模块在工控领域的应用

    在工业现场中,往往需要对温度.电流.电压等模拟量进行控制采集,这可以使用PLC对这些数据进行采集,但是如今生产各种PLC模拟量采集模块的厂家非常多,不同类型的PLC都是有自己专属的模拟量采集模块的,不 ...

  4. 基于 prometheus 的微服务指标监控

    基于prometheus的微服务指标监控 服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等.而通过指标监控能清晰的 ...

  5. 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义

    摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...

  6. Django实现文件上传功能

    文件上传 关注公众号"轻松学编程"了解更多. 1.创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置,MEDIA_ROOT=o ...

  7. 请纠正这5个PHP编码小陋习

    在做过大量的代码审查后,我经常看到一些重复的错误,以下是纠正这些错误的方法. 在循环之前测试数组是否为空 $items = []; // ... if (count($items) > 0) { ...

  8. 动态规划——用二进制表示集合的状态压缩DP

    动态规划当中有非常常见的一个分支--状态压缩动态规划,很多人对于状态压缩畏惧如虎,但其实并没有那么难,希望这文章能带你们学到这个经典的应用. 二进制表示状态 在讲解多重背包问题的时候,我们曾经讲过二进 ...

  9. XJOI 夏令营501-511NOIP训练14 砍树(2)

    小A是小B家的园丁.小B的家里有n棵树,第i棵树的横坐标为i.一天,小B交给小A一个任务,让他降低自己家中的某些树木的高度.这个任务对小A来说十分简单,因为他有一把极其锋利的斧头和一门独门砍树秘籍,能 ...

  10. java实现KFC点餐系统

    这篇文章主要为大家详细介绍了java实现KFC点餐系统,模拟肯德基快餐店的收银系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 同学们应该都去麦当劳或肯德基吃过快餐吧?请同学们参考肯德基官网的信 ...