csv.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package utils
  2. import (
  3. "encoding/csv"
  4. "log"
  5. "net"
  6. "os"
  7. "strconv"
  8. "time"
  9. )
  10. type PingData struct {
  11. IP net.IPAddr
  12. Count int
  13. Received int
  14. Delay time.Duration
  15. }
  16. type CloudflareIPData struct {
  17. *PingData
  18. recvRate float32
  19. downloadSpeed float32
  20. }
  21. func (cf *CloudflareIPData) getRecvRate() float32 {
  22. if cf.recvRate == 0 {
  23. pingLost := cf.Count - cf.Received
  24. cf.recvRate = float32(pingLost) / float32(cf.Count)
  25. }
  26. return cf.recvRate
  27. }
  28. func ExportCsv(filePath string, data []CloudflareIPData) {
  29. fp, err := os.Create(filePath)
  30. if err != nil {
  31. log.Fatalf("创建文件[%s]失败:%v", filePath, err)
  32. return
  33. }
  34. defer fp.Close()
  35. w := csv.NewWriter(fp) //创建一个新的写入文件流
  36. w.Write([]string{"IP 地址", "已发送", "已接收", "丢包率", "平均延迟", "下载速度 (MB/s)"})
  37. w.WriteAll(convertToString(data))
  38. w.Flush()
  39. }
  40. func (cf *CloudflareIPData) toString() []string {
  41. result := make([]string, 6)
  42. result[0] = cf.IP.String()
  43. result[1] = strconv.Itoa(cf.Count)
  44. result[2] = strconv.Itoa(cf.Received)
  45. result[3] = strconv.FormatFloat(float64(cf.getRecvRate()), 'f', 2, 32)
  46. result[4] = cf.Delay.String()
  47. result[5] = strconv.FormatFloat(float64(cf.downloadSpeed)/1024/1024, 'f', 2, 32)
  48. return result
  49. }
  50. func convertToString(data []CloudflareIPData) [][]string {
  51. result := make([][]string, 0)
  52. for _, v := range data {
  53. result = append(result, v.toString())
  54. }
  55. return result
  56. }