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. TypeScript魔法堂:函数类型声明其实很复杂

    前言 江湖有传"动态类型一时爽,代码重构火葬场",由于动态类型语言在开发时不受数据类型的约束,因此非常适合在项目原型阶段和初期进行快速迭代开发使用,这意味着项目未来将通过重写而非重 ...

  2. bat批处理常用脚本

    windows下有很多场景需要编写批处理来解决问题,跟定时任务相结合使用更佳. 1.创建文件,md,mkdir都可以进行文件创建 set AwrPath=D:\OracleTabChk if not ...

  3. 深入探究ASP.NET Core Startup初始化

    前言 Startup类相信大家都比较熟悉,在我们使用ASP.NET Core开发过程中经常用到的类,我们通常使用它进行IOC服务注册,配置中间件信息等.虽然它不是必须的,但是将这些操作统一在Start ...

  4. windows下redis的PHP扩展安装

    1.查看已安装PHP的信息,打印phpinfo(); 主要看三个信息:PHP版本,是否线程安全(TS或NTS),系统是x64还是x86.用以确定扩展文件的版本. 2.需要php_redis.dll这个 ...

  5. 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖

    1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...

  6. Codeforces 1404 D. Game of Pairs

    Codeforces 1404 D.Game of Pairs 给定\(2n\)个数\(1,2,...,2n\),A 和 B 将进行交互,规则如下: A 需要将元素分成 n 组 \(\mathbf{p ...

  7. Linux 基础命令及基本目录

    Linux 基础命令及基本目录 一.网卡 1.网卡配置文件路径 ​ /etc/sysconfig/network-scripts/ifcfg-eth0 配置文件: TYPE=Ethernet # 以太 ...

  8. 关于BigDecimal转String的准确性问题

    case 1: String str=new BigDecimal(123.9).toString() 输出str:123.90000000000000568434188608080148696899 ...

  9. pycharm 报错及解决方法

    1.报错: AttributeError: 'list' object has no attribute 'click' 原因:应是find_element_by 不是 find_elements_b ...

  10. HttpClient4.5X使用-集成微服务

    HttpClient4.5X使用-集成微服务       1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...