gpt4 book ai didi

csv - 总结csv的内容

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:58 24 4
gpt4 key购买 nike

上下文我正在努力创建一个小程序,它可以总结一堆乱七八糟的账单的内容,它是 csv 格式的。

该法案有我感兴趣的三列:

  1. 事件类型。在这里,我只对该列显示为 CHARGE 的行感兴趣
  2. 费用。不言自明。
  3. 资源名称,包含服务器和集群名称。格式为服务器名.集群名。

想法是选择标记为费用的行,首先按集群拆分它们,然后按服务器名称拆分它们,然后对每个行的总成本求和。

我忍不住觉得这应该很容易,但我已经为此绞尽脑汁了一段时间,似乎就是想不通。在这一点上,我应该声明我是编程新手,而且是 GO 的新手。

这是我目前所拥有的:

package main

import (
"encoding/csv"
"log"
"os"
"sort"
"strings"
)



func main() {
rows := readBill("bill-2018-April.csv")
rows = calculateSummary(rows)
writeSummary("bill-2018-April-output", rows)

}

func readBill(name string) [][]string {

f, err := os.Open(name)

if err != nil {
log.Fatalf("Cannot open '%s': %s\n", name, err.Error())
}

defer f.Close()

r := csv.NewReader(f)

rows, err := r.ReadAll()

if err != nil {
log.Fatalln("Cannot read CSV data:", err.Error())
}

return rows
}

type charges struct {
impactType string
cost float64
resName string
}
func createCharges(rows [][]string){
charges:= []charges{}
for i,r:=range rows {
var c charges
c.impactType :=r [i][10]
c.cost := r [i][15]
c.resName := r [i][20]
charges = append()
}
return charges
}

因此,据我所知,我现在应该已经分离出我感兴趣的列(即第 10、15 和 20 列)。到目前为止,我所知道的是否正确?

我将如何挑出显示为“CHARGE”的行并按集群和服务器划分所有内容?

总结起来应该不会太棘手,但无论出于何种原因,这真的让我很困惑。

最佳答案

只需使用两个映射来存储每个服务器和每个集群的总和。由于您对整个 CSV 文件不感兴趣,而只对某些行感兴趣,因此阅读所有内容有点浪费。只需跳过您不关心的行:

package main

import (
"encoding/csv"
"fmt"
"io"
"log"
"strconv"
"strings"
)

func main() {
b := `
,,,,,,,,,,CHARGE,,,,,100.00,,,,,s1.c1
,,,,,,,,,,IGNORE,,,,,,,,,,
,,,,,,,,,,CHARGE,,,,,200.00,,,,,s2.c1
,,,,,,,,,,CHARGE,,,,,300.00,,,,,s3.c2
`

r := csv.NewReader(strings.NewReader(b))

byServer := make(map[string]float64)
byCluster := make(map[string]float64)

for i := 0; ; i++ {
row, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}

if row[10] != "CHARGE" {
continue
}

cost, err := strconv.ParseFloat(row[15], 64)
if err != nil {
log.Fatalf("row %d: malformed cost: %v", i, err)
}

xs := strings.SplitN(row[20], ".", 2)
if len(xs) != 2 {
log.Fatalf("row %d: malformed resource name", i)
}

server, cluster := xs[0], xs[1]

byServer[server] += cost
byCluster[cluster] += cost
}

fmt.Printf("byServer: %+v\n", byServer)
fmt.Printf("byCluster: %+v\n", byCluster)
}

// Output:
// byServer: map[s2:200 s3:300 s1:100]
// byCluster: map[c1:300 c2:300]

在 Playground 上试试:https://play.golang.org/p/1e9mJf4LyYE

关于csv - 总结csv的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51876709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com