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

  • 需求

    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

}
posted @ 2021-06-29 15:16  HaimaBlog  阅读(1267)  评论(0编辑  收藏  举报