Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
总结csv的内容_Csv_Go_Struct_Slice_Summarize - Fatal编程技术网

总结csv的内容

总结csv的内容,csv,go,struct,slice,summarize,Csv,Go,Struct,Slice,Summarize,上下文 我正在创建一个小程序,可以总结出一个绝对混乱的账单的内容,它是csv格式的 该法案有三栏我感兴趣: 事件类型。在这里,我只对该列读取CHARGE的行感兴趣 成本。不言自明 资源名称,包含服务器和群集名称。格式为servername.clustername 我们的想法是选择标记为charge的行,首先按集群划分,然后按服务器名称划分,然后汇总每个行的总成本 我忍不住觉得这应该很容易,但我已经在这上面抓了一段时间了,只是似乎不明白。在这一点上,我应该声明,我对编程是相当陌生的,而且是全新的

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

该法案有三栏我感兴趣:

  • 事件类型。在这里,我只对该列读取CHARGE的行感兴趣
  • 成本。不言自明
  • 资源名称,包含服务器和群集名称。格式为servername.clustername
  • 我们的想法是选择标记为charge的行,首先按集群划分,然后按服务器名称划分,然后汇总每个行的总成本

    我忍不住觉得这应该很容易,但我已经在这上面抓了一段时间了,只是似乎不明白。在这一点上,我应该声明,我对编程是相当陌生的,而且是全新的

    以下是我目前掌握的情况:

    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]
    

    在操场上试一试:

    我们可以在CSV中获得一个示例数据吗?使用`fmt.Println(string(rows)),将
    转换为字符串。根据问题文本,听起来好像您有没有试过运行的代码。如果您想知道您的代码是否达到预期效果,请运行它并查看。感谢您的回复!我今天要试试这种东西。