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的标题字段和第一条数据;如果文件存在,追加写一条数据

  • 需求

    1. 给定一个以@为分隔符的字符串,分隔了4条信息,还需要再加上时间戳信息,然后按照特定的顺序写入csv中

      笔者因为任务需要,在windows和linux系统中都运行了一遍代码,发现在追加写操作时:
    2. 在windows系统中,代码 txt, err := os.OpenFile(csvName, os.O_APPEND, 0666) 运行无误
    3. 而在linux系统中,必须添加 os.O_RDWR(以读写的方式打开) 才能追加写成功,代码为 os.OpenFile(csvName, os.O_APPEND|os.O_RDWR, 0666)
  • 笔者刚开始接触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操作的更多相关文章

  1. Java CSV操作(导出和导入)

    Java CSV操作(导出和导入)  CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...

  2. csv操作帮助类

    功能描述: 集合转换为csv数据 DataSe转换为csv数据 using System; using System.Collections.Generic; using System.Data; u ...

  3. 【Java】Java CSV操作代码

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

  4. python之pandas数据筛选和csv操作

    本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...

  5. pandas 写csv 操作

    pandas 写csv 操作 def show_history(self): df = pd.DataFrame() df['Time'] = pd.Series(self.time_hist) df ...

  6. golang csv问题

    go语言自带的有csv文件读取模块,看起来好像不错,今天玩玩,也算是系统学习go语言的一部分--^_^ 一.写csv文件 函数: func NewWriter(w io.Writer) *Writer ...

  7. Golang 中操作 Mongo Update 的方法

    Golang 和 MongoDB 中的 ISODate 时间交互问题 2018年02月27日 11:28:43 独一无二的小个性 阅读数:357 标签: GolangMongoDB时间交互时间转换 更 ...

  8. python之csv操作

    在使用python爬虫时或者其他情况,都会用到csv存储与读取的相关操作,我们在这里就浅谈一下: CSV(Comma-Separated Values)逗号分隔符,也就是每条记录中的值与值之间是用分号 ...

  9. Golang文件操作整理

    基本操作 文件创建 创建文件的时候,一定要注意权限问题,一般默认的文件权限是 0666 关于权限的相关内容,具体可以参考鸟叔p141 这里还是再回顾下,文件属性 r w x r w x r w x,第 ...

  10. golang数据库操作初体验

    在golang中,提供了标准的数据库接口database/sql包,做过数据库开发的应该知道,不同的数据库有不同的数据库驱动.比如mysql等,我们可以去找 https://golang.org/s/ ...

随机推荐

  1. Scala 复杂分词求和(二元组)

    1 package chapter07 2 3 object Test18_ComplexWordCount { 4 def main(args: Array[String]): Unit = { 5 ...

  2. 【mybatis踩坑】mybatis获取类型为字符串String的参数自动加引号

    今天写了一个简单的测试例子,用mybatis实现新建一个MySQL数据表 整体是JavaWeb项目,下面的代码是不完整的. 这是mapper 1 <?xml version="1.0& ...

  3. #组合计数,全排列#洛谷 2518 [HAOI2010]计数

    题目 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数. 比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...

  4. nginx集成brotli压缩算法

    本文于2017年2月中旬完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. Google开源Brotli压缩算法 Brotli是一种全新的数据 ...

  5. Go 语言 Printf 函数和格式化动词详解

    Printf() 函数可以使用多种格式化动词对输出进行格式化.下面是可以与所有数据类型一起使用的一些通用格式化动词: 以下动词适用于所有数据类型: 动词 描述 %v 以默认格式打印值 %#v 以 Go ...

  6. openGauss每日一练(全文检索)

    openGauss 每日一练(全文检索) 本文出处:https://www.modb.pro/db/224179 学习目标 学习 openGauss 全文检索 openGauss 提供了两种数据类型用 ...

  7. 第十六篇:jQuery基础

    一.jQuery和Dom的关系 http://jquery.cuishifeng.cn/ 模块,类库 DOM/BOM/JavaScript的类库: 二.jQuery选择器 1.查找元素 DOM: 10 ...

  8. CDH5.15.1集群安装部署

    CDH集群安装部署 大数据平台软件清单 本文部署的大数据基础平台为CDH,操作系统的版本为CentOS6.8,JDK的版本为1.8,Cloudera Manager与CDH的版本为5.15.1,数据库 ...

  9. C#开发的PhotoNet看图软件 - 开源研究系列文章 - 个人小作品

    这几天忙于编程.上次发布了壁纸管理器的插件版( https://www.cnblogs.com/lzhdim/p/18074135 ),然后整理和添加了一下相关的壁纸图片文件,虽然在管理器中也能浏览壁 ...

  10. 重新整理 .net core 实践篇—————grpc工具[三十四]

    前言 简单整理一下grpc工具. 正文 工具核心包: Grpc.Tools 这个是项目要引用的包,用来生成cs代码的. dotnet-grpc 这个就是cli,命令行工具 dotnet-grpc 核心 ...