总结csv

时间:2018-08-16 12:07:26

标签: csv go struct slice summarize

上下文 我正在创建一个小程序,可以总结出绝对混乱的帐单内容,格式为csv。

该帐单有我感兴趣的三列:

  1. 事件类型。在这里,我只对本列读取CHARGE的行感兴趣
  2. 费用。自我解释。
  3. 资源名称,包含服务器和群集名称。格式为servername.clustername。

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

我忍不住觉得应该很容易,但是我已经为此花了一段时间,似乎无法弄清楚。在这一点上,我应该指出,我是编程的新手,而对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”的行,并按群集和服务器将所有内容切成薄片?

总结一下事情应该不会太棘手,但是无论出于什么原因,这真的让我很沮丧。

1 个答案:

答案 0 :(得分:1)

只需使用两个映射来存储每个服务器和每个群集的总和。而且,由于您对整个CSV并不感兴趣,而只对某些行感兴趣,因此读取所有内容都是很浪费的。只需跳过不需要的行即可:

mkdir /tmp/zshdebug
cat <<'EOF' > /tmp/zshdebug/.zshrc
repeat_string(){
  # this works fine
  printf "-%.0s" $(seq 1 $(( $COLUMNS - 1)))

  # this doesn't works fine
  # printf "-%.0s" $(seq 1 $COLUMNS)
}

TMOUT=1

TRAPALRM() {
  PROMPT="$(repeat_string)
  $(date)
  hello >>>"
  zle reset-prompt
}
EOF
ZDOTDIR=/tmp/zshdebug zsh

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