从文件中读取数据,计算时间差并记录到excel表格中

陌路散爱 提交于 2020-01-17 03:19:26

接到一个任务,将类似如下图中的十万条数据:
在这里插入图片描述

  1. 格式:
    本地接收时间 [编号] Recived on [hello]: ‘发送的消息|发送时间|test’

  2. 要求:
    计算出每两条的时间差,接收时间与发送时间的时间差

  3. 思路:
    创建excel—>读取文件—>取出接收时间和发送时间—>进行比较

  4. 代码实现:

    package main
    
    import (
    	"bufio"
    	"fmt"
    	"github.com/360EntSecGroup-Skylar/excelize"
    	"io"
    	"os"
    	"strings"
    	"time"
    )
    
    func main() {
    	//创建一个excel表格
    	xlsx := excelize.NewFile()
    	index := xlsx.NewSheet("Sheet1")
    	cate := map[string]string{"A1": "编号", "B1": "发送时间", "C1": "接收时间", "D1": "接收时间每两次时间差", "E1": "发送和接收的时间差"}
    	for k, v := range cate {
    		xlsx.SetCellValue("Sheet1", k, v)
    	}
    	sendTime, n := send(xlsx)
    	UnixTime1 := sub1(xlsx)
    
    	Row := 2
    	for i := 0; i < n; i++ {
    		E := UnixTime1[i] - sendTime[i] //用接收的时间戳减去发送的时间戳==>发送和接收的时间差
    		rowStr := fmt.Sprintf("%d", Row)
    		xlsx.SetCellValue("Sheet1", "E"+rowStr, E) //发送和sub1时间差
    		Row++
    	}
    
    	xlsx.SetActiveSheet(index)
    	// 按给定路径保存xlsl文件
    	err := xlsx.SaveAs("./sub2.xlsx")
    	if err != nil {
    		fmt.Println(err)
    	}
    
    }
    
    //发送的时间
    func send(xlsx *excelize.File) (sendTime []int64, count int) {
    	//打开文件
    	file, err := os.Open("D:/log_sub5.txt")
    	if err != nil {
    		fmt.Println("open file err=", err)
    	}
    	defer file.Close()
    	reader := bufio.NewReader(file)
    	//从excel的第二行开始,第一行是表头
    	rowID := 2
    
    	for {
    		str, err := reader.ReadString('\n')
    		if err == io.EOF {
    			break
    		}
    		timeArr := strings.Split(str, "|")
    		T, _ := time.Parse("2006/01/02 15:04:05", timeArr[2])
    		sendTime = append(sendTime, T.UnixNano()) //将计算的发送时间的纳秒放到sendTime切片中
    		idxStr := fmt.Sprintf("%d", rowID)
    		//文件有多少条数据
    		count++
    		xlsx.SetCellValue("Sheet1", "A"+idxStr, count)
    		xlsx.SetCellValue("Sheet1", "B"+idxStr, timeArr[2])
    		rowID = rowID + 1
    	}
    	return
    }
    
    //接收时间
    func sub1(xlsx *excelize.File) (UnixTime1 []int64) {
    	file, err := os.Open("D:/log_sub5.txt")
    	if err != nil {
    		fmt.Println("open file err=", err)
    	}
    	defer file.Close()
    	reader := bufio.NewReader(file)
    	rowID := 2
    	var count int
    	for {
    		str, err := reader.ReadString('\n')
    		if err == io.EOF {
    			break
    		}
    		timeArr := strings.Split(str, " [")
    		T, _ := time.Parse("2006/01/02 15:04:05", timeArr[0])
    		UnixTime1 = append(UnixTime1, T.UnixNano())
    		idxStr := fmt.Sprintf("%d", rowID)
    		count++
    		xlsx.SetCellValue("Sheet1", "C"+idxStr, timeArr[0])
    		rowID = rowID + 1
    	}
    	Row := 2
    	//注意:数组溢出问题
    	for i := 0; i < count-1; i++ {
    		n := UnixTime1[i+1] - UnixTime1[i] //让后一行减去前一行的时间戳==>时间差
    		rowStr := fmt.Sprintf("%d", Row)
    		xlsx.SetCellValue("Sheet1", "D"+rowStr, n)
    		Row++
    	}
    	return
    }
    
    
  5. 结果:
    在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!