首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >csv内容综述

csv内容综述
EN

Stack Overflow用户
提问于 2018-08-16 12:07:26
回答 1查看 57关注 0票数 1

Context --我正在创建一个小程序,它可以概括出一个绝对混乱的账单的内容,这是一种csv形式。

该法案有三栏我感兴趣:

  1. 事件类型。在这里,我只感兴趣的行,这一栏读充电
  2. 费用。不言自明。
  3. 资源名称,包含服务器和群集名称。格式是servername.clustername。

这样做的目的是选择被标记为费用的行,首先按照集群,然后按服务器名称将它们分开,然后总结每个行的总成本。

我情不自禁地觉得这应该很容易,但我已经在这上面挠头了一段时间了,只是似乎想不出来。在这一点上,我应该说,我是相当新的编程和全新的去。

到目前为止,我的情况如下:

代码语言:javascript
运行
复制
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列)。到目前为止我所拥有的都是正确的吗?

我将如何选择读“充电”的行,并按集群和服务器将所有内容切片?

总结事情不应该太棘手,但无论什么原因,这真的是我的绊脚石。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 12:42:36

只需使用两个映射来存储每个服务器和每个集群的和。而且,由于您对整个CSV不感兴趣,而只对一些行感兴趣,所以阅读所有内容都是一种浪费。只需跳过您不关心的行:

代码语言:javascript
运行
复制
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]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51876709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档