Golang csv操作
csv读写
封装成工具包
package utils
import (
"encoding/csv"
"fmt"
"log"
"os"
"path"
"time"
)
func ReadCsv(filePath string) (data [][]string, err error) {
f, err := os.Open(filePath)
if err != nil{
fmt.Println(err)
return
}
defer f.Close()
w := csv.NewReader(f)
data, err = w.ReadAll()
if err != nil{
fmt.Println(err)
return
}
//fmt.Println(data)
return data,nil
}
/*
filename := "shodan-port-all" 文件名,不要后缀
columns := [][]string{{"姓名", "电话", "公司", "职位", "加入时间"}, {"1", "2", "刘犇,刘犇,刘犇", "4", "5"}}
utils.ExportCsv("log/", "shodan-port", columns) 会存到log/shodan-port-2021-09-07 23:23:14.csv里
*/
func ExportCsv(savePath, fileName string, data [][]string) {
fmt.Println("data22222",data)
filePath := fmt.Sprintf("%s-%s.csv",fileName,time.Now().Format("2006-01-02"))
floder := "./"
if len(savePath) >= 0 {
floder = path.Join(floder, savePath)
}
if _, err := os.Stat(floder); err != nil {
if !os.IsExist(err) {
os.MkdirAll(floder, os.ModePerm)
}
}
fp, err := os.Create(path.Join(floder,filePath)) // 创建文件句柄
if err != nil {
log.Fatalf("创建文件["+filePath+"]句柄失败,%v", err)
return
}
defer fp.Close()
fp.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
w := csv.NewWriter(fp) //创建一个新的写入文件流
w.WriteAll(data)
w.Flush()
}
原文链接:https://blog.csdn.net/ljrsunshine/article/details/100107705
追加写入
Golang
判断文件是否存在:如果文件不存在,那么创建文件,并写入csv的标题字段和第一条数据;如果文件存在,追加写一条数据
需求
- 给定一个以@为分隔符的字符串,分隔了4条信息,还需要再加上时间戳信息,然后按照特定的顺序写入csv中
笔者因为任务需要,在windows和linux系统中都运行了一遍代码,发现在追加写操作时: - 在windows系统中,代码 txt, err := os.OpenFile(csvName, os.O_APPEND, 0666) 运行无误
- 而在linux系统中,必须添加 os.O_RDWR(以读写的方式打开) 才能追加写成功,代码为 os.OpenFile(csvName, os.O_APPEND|os.O_RDWR, 0666)
- 给定一个以@为分隔符的字符串,分隔了4条信息,还需要再加上时间戳信息,然后按照特定的顺序写入csv中
笔者刚开始接触Go语言,若有代码结构和语法不规范的地方,请多包涵!
代码
package main
import (
"encoding/csv"
"fmt"
"os"
"strings"
"time"
)
func main() {
m3u8_dir_path := "13429235688@01@05@09"
data := strings.Split(m3u8_dir_path, "@")
//需要在index=1的地方插入时间戳,方便以“id time emo val arou”的顺序写入csv文件
//将index=1后面的数据保存到一个临时的切片(其实是对index后面数据的复制)
tmp := append([]string{}, data[1:]...)
//拼接插入的时间戳
data = append(data[0:1], time.Now().Format("20060102150405"))
//与临时切片再组合得到最终的需要的切片
data = append(data, tmp...)
fmt.Printf("data[0]: %s\n", data[0])
fmt.Printf("data[1]: %s\n", data[1])
fmt.Printf("data[2]: %s\n", data[2])
fmt.Printf("data[3]: %s\n", data[3])
fmt.Printf("data[4]: %s\n", data[4])
csvName := data[0] + ".csv"
file, er := os.Open(csvName)
defer file.Close()
// 如果文件不存在,创建文件
if er != nil && os.IsNotExist(er) {
file, er := os.Create(csvName)
if er != nil {
panic(er)
}
defer file.Close()
// 写入字段标题
w := csv.NewWriter(file) //创建一个新的写入文件流
title := []string{"user_id", "time", "emo", "val", "arou"}
// 这里必须刷新,才能将数据写入文件。
w.Write(title)
w.Write(data)
w.Flush()
fmt.Printf("if end")
} else {
// 如果文件存在,直接加在末尾
txt, err := os.OpenFile(csvName, os.O_APPEND|os.O_RDWR, 0666)
defer txt.Close()
if err != nil {
panic(err)
}
w := csv.NewWriter(txt) //创建一个新的写入文件流
w.Write(data)
w.Flush()
fmt.Printf("else end")
}
}
追加写入封装
func FileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
if info == nil {
return false
}
return true
}
/*
文件没有创建并写入,有追加写
filename := "/Users/icsoc/Downloads/test.csv"
columns := [][]string{{"姓名", "电话", "公司", "职位", "加入时间"}, {"1", "2", "刘犇,刘犇,刘犇", "4", "5"}}
utils.ExportCsvWithAdd("log/", "shodan-port", columns) 会存到static/downloads.csv里
*/
func ExportCsvWithAdd(savePath, fileName string, data [][]string) (fPath string) {
fileNamePath := fmt.Sprintf("%s.csv", fileName)
floder := "./"
if len(savePath) >= 0 {
floder = filepath.Join(floder, savePath)
}
// 创建文件夹
if _, err := os.Stat(floder); err != nil {
if !os.IsExist(err) {
os.MkdirAll(floder, os.ModePerm)
}
}
fPath = filepath.Join("./", floder, fileNamePath)
if !FileExists(fPath) {
fp, err := os.Create(fPath) // 创建文件句柄
if err != nil {
log.Fatalf("创建文件["+fileNamePath+"]句柄失败,%v", err)
return
}
defer fp.Close()
fp.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
w := csv.NewWriter(fp) //创建一个新的写入文件流
w.WriteAll(data)
w.Flush()
} else {
// 如果文件存在,直接加在末尾
txt, err := os.OpenFile(fPath, os.O_APPEND|os.O_RDWR, 0666)
defer txt.Close()
if err != nil {
log.Printf("os.OpenFile fail , fPath:%v", fPath)
return
}
w := csv.NewWriter(txt) //创建一个新的写入文件流
w.WriteAll(data)
w.Flush()
}
return fPath
}
Golang csv操作的更多相关文章
- Java CSV操作(导出和导入)
Java CSV操作(导出和导入) CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...
- csv操作帮助类
功能描述: 集合转换为csv数据 DataSe转换为csv数据 using System; using System.Collections.Generic; using System.Data; u ...
- 【Java】Java CSV操作代码
CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...
- python之pandas数据筛选和csv操作
本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...
- pandas 写csv 操作
pandas 写csv 操作 def show_history(self): df = pd.DataFrame() df['Time'] = pd.Series(self.time_hist) df ...
- golang csv问题
go语言自带的有csv文件读取模块,看起来好像不错,今天玩玩,也算是系统学习go语言的一部分--^_^ 一.写csv文件 函数: func NewWriter(w io.Writer) *Writer ...
- Golang 中操作 Mongo Update 的方法
Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更 ...
- python之csv操作
在使用python爬虫时或者其他情况,都会用到csv存储与读取的相关操作,我们在这里就浅谈一下: CSV(Comma-Separated Values)逗号分隔符,也就是每条记录中的值与值之间是用分号 ...
- Golang文件操作整理
基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...
- golang数据库操作初体验
在golang中,提供了标准的数据库接口database/sql包,做过数据库开发的应该知道,不同的数据库有不同的数据库驱动.比如mysql等,我们可以去找 https://golang.org/s/ ...
随机推荐
- 6 HTML图片标签
6 图片标签 在HTML中,图像由标签定义的,它可以用来加载图片到html网页中显示.网页开发过程中,有三种图片格式被广泛应用到web里,分别是 jpg.png.gif. img标签的属性: /* s ...
- #KD-Tree,替罪羊树#洛谷 6224 [BJWC2014]数据
题目 平面上有 \(N\) 个点.需要实现以下三种操作: 在点集里添加一个点: 给出一个点,查询它到点集里所有点的曼哈顿距离的最小值: 给出一个点,查询它到点集里所有点的曼哈顿距离的最大值. 分析 用 ...
- [一本通1700]PFS集合
题目描述 有一种特殊的集合叫做PFS(Prefix Free Set)集合. 一个PFS集合由若干字符串构成,且不存在一个字符串是另一个字符串的前缀.空集也被看作是PFS集合. 例如 {\(" ...
- 第一视角看方法调用时的jvm
关于比较学术的jvm每个内存区域我之前都写过,就不重复赘述了,这里附上链接:https://www.cnblogs.com/gmt-hao/p/13603534.html, https://www.c ...
- Redis 19 SpringBoot集成
概述 SpringBoot 整合 Redis 是使用 SpringData 实现的. SpringData 是与 SpringBoot 齐名的顶级项目,整合了对常用数据库的模板型操作. 在 Sprin ...
- VMware下CentOS7.6安装openGauss
VMware 下 CentOS7.6(7.9)安装 openGauss centos 安装 这里我使用的是 vmware workstation Pro 15 虽然官网了解了一下 openGauss ...
- WGAN
wgan之前, 原始GAN出现了什么问题? https://www.cnblogs.com/Allen-rg/p/10305125.html 判别器越好,生成器梯度消失越严重 一句话概括:最小化第二种 ...
- 推荐两款HTTP请求Mock利器
1.背景 在日常测试过程中或者研发开发过程中,目前接口暂时没有开发完成,测试人员又要提前介入接口测试中,测试人员不仅仅只是简单的编写测试用例,也可以通过一些mock的方法进行来提前根据接口测试的情况进 ...
- 面试官:说一说CyclicBarrier的妙用!我:这个没用过
写在开头 面试官:同学,AQS的原理知道吗? 我:学过一点,抽象队列同步器,Java中很多同步工具都是基于它的... 面试官:好的,那其中CyclicBarrier学过吗?讲一讲它的妙用吧 我:啊,这 ...
- 记一次WPF的DataGrid绑定数据
之前一直在用winform,但是感觉界面不好看,然后就自己在网上学习WPF.一开始看到DataGrid的时候,还以为它是DataGridView,然后用winform的方法绑定数据发现不行,在不断的查 ...