【Golang】基础-操作 csv 文件
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 文件的更多相关文章
- Python数据分析基础——读写CSV文件
1.基础python代码: #!/usr/bin/env python3 # 可以使脚本在不同的操作系统之间具有可移植性 import sys # 导入python的内置sys模块,使得在命令行中向脚 ...
- 用javacsv API 来操作csv文件
javacsv是国外开发的一个比较好的操作csv文件的API,这里简单讲一下用法. 先下载javacsv2.0.zip的文件,解压后,把javacsv.jar 添加到项目中. 本站下载地址: htt ...
- C#操作.csv文件Demo
1.使用OleDB操作.csv文件,比较费时 public static DataTable GetDataTableFromCsv(string path,bool isFirstRowHeader ...
- java操作csv文件之javacsv.jar应用
csv文件是分隔文件,如果使用java的io流来写,比较麻烦,这里为大家提供一个javacsv的jar包,这个很方便操作csv文件. 下载地址:https://pan.baidu.com/s/1i46 ...
- java 操作 csv文件
CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...
- python中操作csv文件
python中操作csv文件 读取csv improt csv f = csv.reader(open("文件路径","r")) for i in f: pri ...
- springbatch操作CSV文件
一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到还有一个csv文件 ...
- Python操作csv文件
1.什么是csv文件 The so-called CSV (Comma Separated Values) format is the most common import and export fo ...
- CsvReader和CsvWriter操作csv文件
使用方法: 提供把实例数据输出到磁盘csv文件的功能 提供读取csv文件,并封装成指定实例的功能 小工具自己依赖了slf4j+logbak,以及fastJson,如果与系统冲突,可以在pom文件中去除 ...
随机推荐
- CodeForces 578E Walking!
题意 略. 题解 好毒瘤啊,我最多就口胡第一问的样子吧. 第一问很显然(跟凤凰县探险队员一样显然),就是每次贪心选长度最大的满足条件的子序列,选不到就折返回来.所以折返的次数很明显就是选出子序列的个数 ...
- 4G DTU的数据透传功能如何实现
准备将众山科技4G DTU进行数据透传之前,先将电脑串口连接到4G DTU串口上.如果是没有硬件串口的电脑,可以通过USB转RS232串口转换线进行连接. 连接成功后,按照说明书中提供的初始参数进行设 ...
- python机器学习实现人脸图片自动补全
人脸自动补全 关注公众号"轻松学编程"了解更多. 1.导包 import matplotlib.pyplot as plt import numpy as np import pa ...
- Java的Arrays.sort()方法到底用的什么排序算法
暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序...其实不全对.让我们分析个究竟: 1 // Use Q ...
- 通俗易懂浅谈理解ES6类this不同指向问题
1. class Btn{ //定义的一个类 constructor(id){ // constructor是一个构造函数,是一个默认方法,通过 new 命令创建对象实例时,自动调用该方法.一个类必须 ...
- JavaScript之构造函数
在学习构造函数之前我们需要知道我们学习构造函数需要学习什么: 1.什么是构造函数 2.构造函数用来做什么 3.构造函数的执行过程 4.构造函数的返回值 1.所以首先我们需要知道什么是构造函数: 在 ...
- codeforces 1425E,一万种情况的简单题
大家好,欢迎阅读codeforces专题. 我们今天选中的是codeforces 1425场比赛的E题,这是一场印尼多校联合的ICPC的练习赛.ACM赛制,难度也比较近似.我们今天选择的是其中的一道M ...
- C++ 基础 4:继承和派生
1 继承和派生 在 C++ 中 可重用性是通过继承这一机制实现的.继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易.这样做,也达到了重用代码功能和提高执行效率的效果. 当创 ...
- Java 最佳命名规则记录
类名:使用双驼峰规则.如 TestService 包名:命名全小写,且使用小写 如使用 web.csvdata.util 而不是 web.csvData.util 或 web.csvdata.util ...
- Kubernetes+Promethues+Cloud Alert实践分享
前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...