iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang怎么操作csv文件
  • 650
分享到

golang怎么操作csv文件

2023-06-29 01:06:19 650人浏览 独家记忆
摘要

本文小编为大家详细介绍“golang怎么操作csv文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么操作csv文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。练习要求:写一个小程序解析data

本文小编为大家详细介绍“golang怎么操作csv文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang怎么操作csv文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

练习要求:

写一个小程序解析data.csv,要求实现如下功能:

  1. 接收姓名作为参数。

  2. 根据姓名查找出对应员工的工时信息,并将 日期、上班、下班、工时 打印到标准输出。

  3. 将上一条输出的内容保存到JSON文件,使用姓名.json作为文件名

  4. 根据上条中生成的json文件,计算出该员工的月总工时、每周的平均工时。

考察点:

  1. 结构体定义

  2. 字符串拼接

  3. 类型转换

  4. 编码转换

  5. 命令行参数解析

  6. 文件读取

  7. json库使用

编码:

package main import (    "bufio"    "encoding/json"    "errors"    "flag"    "fmt"    "io"    "os"    "strconv"    "strings"     "GitHub.com/axgle/mahonia") //给 fmt.Println 起一个短的别名。var p = fmt.Println //定义一个全局变量 一个月上班加休息总天数var gAllDays float64 = 0 //定义一个全局变量 考勤异常的天数var gAbnORMalDays int = 0 //上班信息type WorkInfo struct {    WorkDate  string //上班日期    StartTime string //上班打卡时间    EndTime   string //下班打卡时间    LaborHour string //当天工时} //考勤异常信息type WorkAbnormalInfo struct {    WorkDate   string //上班日期    NormalInfo string //异常信息} func ConvertToString(src string, srcCode string, taGCode string) (string, error) {    if len(src) == 0 || len(srcCode) == 0 || len(tagCode) == 0 {        return "", errors.New("input arguments error")    }    srcCoder := mahonia.NewDecoder(srcCode)    srcResult := srcCoder.ConvertString(src)    tagCoder := mahonia.NewDecoder(tagCode)    _, cdata, _ := tagCoder.Translate([]byte(srcResult), true)    result := string(cdata)     return result, nil} func WriteFile(name string, buf string) error {    if len(name) == 0 || len(buf) == 0 {        return errors.New("input arguments error")    }     fout, err := os.OpenFile(name, os.O_CREATE|os.O_RDWR, 0666)    defer fout.Close()    if err != nil {        return err    }     //写入到本地文件中    fout.WriteString(buf)     return nil} func ReadFile(name string) ([]byte, error) {    if len(name) == 0 {        return nil, errors.New("input arguments error")    }     //打开本地文件 读取出全部数据    fin, err := os.Open(name)    defer fin.Close()    if err != nil {        return nil, errors.New("Close error")    }     buf_len, _ := fin.Seek(0, os.SEEK_END)    fin.Seek(0, os.SEEK_SET)     buf := make([]byte, buf_len)    fin.Read(buf)     return buf, nil} func ReadCsvFile(csvName string, employeeName string) ([]WorkInfo, error) {    if len(csvName) == 0 || len(employeeName) == 0 {        return nil, errors.New("error: input arguments error")    }     var WorkInfoSet []WorkInfo    var AbnormalSet []WorkAbnormalInfo    var isExistName bool    var dayCount float64 = 0    var isNormal string    var isNormalFlag bool     var index int = 0    var indexWorkDate int    var indexStartTime int    var indexEndTime int    var indexLaborHour int    var indexNormalInfo int    var indexIsNormal int     var i int = 0     f, err := os.Open(csvName)    if err != nil {        return nil, err    }    defer f.Close()     rd := bufio.NewReader(f)    for {        gbk_line, err := rd.ReadString('\n') //以'\n'为结束符读入一行        if err != nil || io.EOF == err {            break        }        //p("gbk:", gbk_line)         //把每一行gbk格式的字符串 转换为 utf-8格式字符串        utf8_line, _ := ConvertToString(gbk_line, "gbk", "utf-8")         //对第一行进行处理        if i == 0 {            i = 1 //保证 只有第一行被处理            p("utf8:", utf8_line)            first_line := strings.Split(utf8_line, ",")             for _, val := range first_line {                 if val == "日期" {                    indexWorkDate = index                }                if val == "上班" {                    indexStartTime = index                }                if val == "下班" {                    indexEndTime = index                }                if val == "工时" {                    indexLaborHour = index                }                if val == "是否有考勤异常" {                    indexIsNormal = index                }                if val == "工时异常" {                    indexNormalInfo = index                }                 index++            }        }         if strings.Contains(utf8_line, employeeName) {            //把存在员工标记为true            isExistName = true             split_line := strings.Split(utf8_line, ",")            person_temp := WorkInfo{split_line[indexWorkDate],                split_line[indexStartTime],                split_line[indexEndTime],                split_line[indexLaborHour],            }             //考勤表天数加1            dayCount++            isNormal = split_line[indexIsNormal]            //统计打卡异常的信息            if isNormal == "是" {                aInfo := WorkAbnormalInfo{split_line[indexWorkDate], split_line[indexNormalInfo]}                AbnormalSet = append(AbnormalSet, aInfo)                 gAbnormalDays++                isNormalFlag = true            }             WorkInfoSet = append(WorkInfoSet, person_temp)        }    }     //统计考勤表里所有天数    gAllDays = dayCount    //对于不存在指定员工名字 的处理    if !isExistName {        p("\nRemind: There is no employee is csv file!\n")        os.Exit(1)    }     //显示员工所有考勤信息    p("\n员工姓名:", employeeName)    p("\n全部考勤信息:")    for _, temp := range WorkInfoSet {        fmt.Printf(            "日期:%s ,上班:%s,下班:%s,工时:%s\n",            temp.WorkDate,            temp.StartTime,            temp.EndTime,            temp.LaborHour,        )    }     //显示员工打卡异常信息    if isNormalFlag {        p("\n异常考勤信息:")        for _, val := range AbnormalSet {            fmt.Printf("日期:%s , 异常信息:%s\n", val.WorkDate, val.NormalInfo)        }        p("温馨提示:考勤出现异常信息,请及时给助理说明情况~_~\n")    }     return WorkInfoSet, nil} func WriteJsonFile(employeeName string, workInfoSet []WorkInfo) error {    if len(employeeName) == 0 || workInfoSet == nil {        return errors.New("error: input arguments error")    }     //把输出内容写入name.json文件中    filename := fmt.Sprintf("%s%s", employeeName, ".json")    str, _ := json.Marshal(workInfoSet)    err := WriteFile(string(str), filename)    if err != nil {        return err    }    return nil} func ReadJsonFile(employeeName string) error {    if len(employeeName) == 0 {        return errors.New("error: input arguments error")    }     var WorkInfoSet []WorkInfo    filename := fmt.Sprintf("%s%s", employeeName, ".json")     ReadJsonBuf, err := ReadFile(filename)    if err != nil {        p(err.Error())        return err    }    var sumHour float64 = 0.0    var dayCount float64 = 0    var weekCounts float64 = 0.0    var averageWeekHour float64 = 0.0     json.Unmarshal(ReadJsonBuf, &WorkInfoSet)     for _, one_work := range WorkInfoSet {         //去掉打卡异常情况和周六末情况 (如果周六末加班 数据依然计算进入总工时)        if one_work.StartTime == "" || one_work.EndTime == "" {            continue        }         one_day_hour, _ := strconv.ParseFloat(one_work.LaborHour, 64)        sumHour += one_day_hour        dayCount++    }     fmt.Printf("根据json文件计算工时,考勤正常天数:%2.0f, 异常天数:%d\n", dayCount, gAbnormalDays)    weekCounts = gAllDays / 7    averageWeekHour = sumHour / weekCounts    //p("考勤表总天数:", gAllDays, ",共多少周:", week_counts)     fmt.Printf("月总工时:%.4f 每周的平均工时:%.4f\n\n", sumHour, averageWeekHour)     return nil} func main() {    args := os.Args     input := flag.String("i", "查无此人", "input employee name")    path := flag.String("p", "./data.csv", "input csv file path")     flag.Parse()     if len(args) == 1 {        fmt.Println("./main: missing operand")        fmt.Println("Try `./main -h' or './main --help' for more information.")        return    }     var csvName string = *path    var employeeName string = *input     //读取csv文件并打印指定员工信息    WorkInfoSet, err := ReadCsvFile(csvName, employeeName)    if err != nil {        p(err.Error())        return    }     //把指定员工信息写入json文件    err = WriteJsonFile(employeeName, WorkInfoSet)    if err != nil {        p(err.Error())        return    }     //读取json文件并计算指定员工总工时和平均工时    err = ReadJsonFile(employeeName)    if err != nil {        p(err.Error())        return    }}

README.md

- USAGE: Analysis csv file command [arguments] ...

- The commands are:
-    -h , --help    cmd help.

- The commands are:
-    -i  input employee name.

- The commands are:
-    -p  input csv file path.

-当文件中不存在指定员工名字时,返回提醒信息


-参考链接:
- Golang GBK转UTF-8 参考链接:https://blog.csdn.net/qq_33285730/article/details/73239263
- golang 文件按行读取:Https://studygolang.com/articles/282
- golang strings包方法:https://studygolang.com/articles/2881

附:使用Golang导出CSV数据并解决数据乱码问题

在日常开发中,针对数据导出,我们可以导出excel格式,但是如果是针对大数据量的导出,直接导出为Excel格式可能需要占用大量内存,且导出速度很慢。这个时候我们就需要导出为CSV格式。

CSV 格式

CSV本质上是文本文件,该文件有以下要求:

  • 列之间用逗号分隔,行之间用换行分隔

  • 单元格如果有逗号、引号之类的字符,该单元格需要使用双引号括起来

  • 如果内容包含中文,直接输出可能会乱码

实现方式

golang 官方有csv的库,可以很容易的实现csv数据的写入。

golang实现csv数据写文件

func main() {f, err := os.Create("data.csv")if err != nil {panic(err)}defer f.Close()f.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM,避免使用Microsoft Excel打开乱码writer := csv.NewWriter(f)writer.Write([]string{"编号", "姓名", "年龄"})writer.Write([]string{"1", "张三", "23"})writer.Write([]string{"2", "李四", "24"})writer.Write([]string{"3", "王五", "25"})writer.Write([]string{"4", "赵六", "26"})writer.Flush() // 此时才会将缓冲区数据写入}

golang实现WEB导出csv数据

此处以gin框架为例,如果用的go官方web库,其实差不多是一样的:

func ExportCsv(c *gin.Context) {bytesBuffer := &bytes.Buffer{}bytesBuffer.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM,避免使用Microsoft Excel打开乱码writer := csv.NewWriter(bytesBuffer)writer.Write([]string{"编号", "姓名", "年龄"})writer.Write([]string{"1", "张三", "23"})writer.Write([]string{"2", "李四", "24"})writer.Write([]string{"3", "王五", "25"})writer.Write([]string{"4", "赵六", "26"})writer.Flush() // 此时才会将缓冲区数据写入// 设置下载的文件名c.Writer.Header().Set("Content-Disposition", "attachment;filename=data.csv")// 设置文件类型以及输出数据c.Data(http.StatusOK, "text/csv", bytesBuffer.Bytes())return}

读到这里,这篇“golang怎么操作csv文件”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网GO频道。

您可能感兴趣的文档:

--结束END--

本文标题: golang怎么操作csv文件

本文链接: https://www.lsjlt.com/news/321933.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang怎么操作csv文件
    本文小编为大家详细介绍“golang怎么操作csv文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang怎么操作csv文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。练习要求:写一个小程序解析data...
    99+
    2023-06-29
  • golang如何操作csv文件详解
    目录练习要求:考察点:编码:README.md附:使用Golang导出CSV数据并解决数据乱码问题CSV 格式实现方式golang实现csv数据写文件golang实现web导出csv...
    99+
    2024-04-02
  • Python 操作.csv文件
    import csv csvfile = file('E:\\workspace\\data\\ex1.csv', 'rb') reader = csv.reader(csvfile) for line in reader:     p...
    99+
    2023-01-31
    操作 文件 Python
  • golang中怎么操作文件
    在Go语言中,读取和修改文件是非常常见的需求。在本文中,我们将介绍如何操作文件,包括打开文件、删除文件内容、获取文件信息和将文件恢复到原始状态等。一、打开文件使用os.OpenFile()函数来打开文件,该函数可以接受许多参数。在本例中,我...
    99+
    2023-05-14
    Golang go语言
  • python3 csv文件基本操作
    csv(Comma-Separated Values),也叫逗号分割值,如果你安装了excel,默认会用excel打开csv文件。 废话少说直接贴代码: import csv # 打开文件,用with打开可以不用去特意关闭file了,p...
    99+
    2023-01-31
    操作 文件 csv
  • Python怎么读取和写入操作CSV文件
    这篇文章主要介绍“Python怎么读取和写入操作CSV文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么读取和写入操作CSV文件”文章能帮助大家解决问题。什么是 CSV 文件?CSV...
    99+
    2023-06-29
  • python之文件操作、OS模块、CSV
    1 文件系统和文件 在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件...
    99+
    2023-01-31
    模块 操作 文件
  • python3.x操作csv文件的实战
    说明python3.x集成了对csv文件的操作,直接引入包即可,但python2.x则需要单独安装。实战1、读取csv文件#引入包 import csv #打开文件 csvfile = open('xiaoqiang.csv',newlin...
    99+
    2023-01-31
    实战 操作 文件
  • Pandas对CSV文件读写操作详解
    目录什么是 CSV 文件CSV 库解析 CSV 文件读取 CSV 文件CSV reader 参数CSV 文件的写入使用 pandas 库解析 CSV 文件pandas 读取 CSV ...
    99+
    2024-04-02
  • Python利用Rows快速操作csv文件
    目录1.准备2.基本使用3.命令行工具Rows 是一个专门用于操作表格的第三方Python模块。 只要通过 Rows 读取 csv 文件,她就能生成可以被计算的 Python 对象。...
    99+
    2024-04-02
  • Python读写csv文件的操作方法
    这篇文章主要介绍了Python读写csv文件的操作方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。要在 Python 中写入 CSV,请使用 Python 的 csv 模块。例如,让我们将一个字符串列表写入一个新的 C...
    99+
    2023-07-06
  • Pandas对CSV文件读写操作的方法
    这篇“Pandas对CSV文件读写操作的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Pandas对CSV文件读写操作的...
    99+
    2023-06-30
  • JS实现导出Excel和CSV文件操作
    一、js导出Excel <html> <head> </head> <body> <script type="text/j...
    99+
    2024-04-02
  • Golang中怎么处理文件读写操作
    在Golang中处理文件读写操作通常使用os包和io/ioutil包。下面是一些常见的文件读写操作示例: 读取文件内容: pac...
    99+
    2024-03-13
    Golang
  • python操作csv格式文件之csv.DictReader()方法
    目录简单使用csv.DictReader()方法使用csv.DictReader()之fieldnames参数使用csv.DictReader()之restkey参数使用csv.Di...
    99+
    2024-04-02
  • golang中如何操作文件
    本篇内容介绍了“golang中如何操作文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Go语言中,读取和修改文件是非常常见的需求。在本文...
    99+
    2023-07-05
  • R语言对CSV文件操作实例讲解
    在 R 语言中,我们可以从存储在 R 语言环境外的文件中读取数据。 我们还可以将数据写入将被操作系统存储和访问的文件。 R 语言可以读取和写入各种文件格式,如​csv&#...
    99+
    2024-04-02
  • Python中CSV文件的读写库操作方法
    目录文件的基本读写用字典模式处理数据非标准格式的处理dialectSnifferCSV 格式的全称是 Comma Separated Values,意思是逗号分割的数据,是最常见的电...
    99+
    2022-12-08
    CSV文件读写库 CSV文件读写 CSV文件
  • mysql实现查询结果导出csv文件及导入csv文件到数据库操作
    本文实例讲述了mysql实现查询结果导出csv文件及导入csv文件到数据库操作。分享给大家供大家参考,具体如下: mysql 查询结果导出csv文件: select logtime, oper...
    99+
    2024-04-02
  • Golang文件读写操作详情
    目录一、概念二、读取文件操作2.1 打开和关闭文件defer 语句2.2 file.Read() 读取文件Read 方法定义ReadAt方法定义一次性读取循环读取2.3 bufio ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作