总结csv的内容

上下文 我正在创建一个小程序,该程序可以汇总 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”的行并按集群和服务器划分所有内容?


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


繁华开满天机
浏览 89回答 1
1回答

30秒到达战场

只需使用两个映射来存储每个服务器和每个集群的总和。由于您对整个 CSV 文件不感兴趣,而只对某些行感兴趣,因此阅读所有内容有点浪费。只需跳过您不关心的行:package mainimport (    "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]在操场上试试:https ://play.golang.org/p/1e9mJf4LyYE
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go