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. CodeForces 578E Walking!

    题意 略. 题解 好毒瘤啊,我最多就口胡第一问的样子吧. 第一问很显然(跟凤凰县探险队员一样显然),就是每次贪心选长度最大的满足条件的子序列,选不到就折返回来.所以折返的次数很明显就是选出子序列的个数 ...

  2. 4G DTU的数据透传功能如何实现

    准备将众山科技4G DTU进行数据透传之前,先将电脑串口连接到4G DTU串口上.如果是没有硬件串口的电脑,可以通过USB转RS232串口转换线进行连接. 连接成功后,按照说明书中提供的初始参数进行设 ...

  3. python机器学习实现人脸图片自动补全

    人脸自动补全 关注公众号"轻松学编程"了解更多. 1.导包 import matplotlib.pyplot as plt import numpy as np import pa ...

  4. Java的Arrays.sort()方法到底用的什么排序算法

    暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序...其实不全对.让我们分析个究竟: 1 // Use Q ...

  5. 通俗易懂浅谈理解ES6类this不同指向问题

    1. class Btn{ //定义的一个类 constructor(id){ // constructor是一个构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法.一个类必须 ...

  6. JavaScript之构造函数

    在学习构造函数之前我们需要知道我们学习构造函数需要学习什么: 1.什么是构造函数  2.构造函数用来做什么 3.构造函数的执行过程  4.构造函数的返回值 1.所以首先我们需要知道什么是构造函数: 在 ...

  7. codeforces 1425E,一万种情况的简单题

    大家好,欢迎阅读codeforces专题. 我们今天选中的是codeforces 1425场比赛的E题,这是一场印尼多校联合的ICPC的练习赛.ACM赛制,难度也比较近似.我们今天选择的是其中的一道M ...

  8. C++ 基础 4:继承和派生

    1 继承和派生 在 C++ 中 可重用性是通过继承这一机制实现的.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行效率的效果. 当创 ...

  9. Java 最佳命名规则记录

    类名:使用双驼峰规则.如 TestService 包名:命名全小写,且使用小写 如使用 web.csvdata.util 而不是 web.csvData.util 或 web.csvdata.util ...

  10. Kubernetes+Promethues+Cloud Alert实践分享

    前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...