【问题标题】:Aggregate CSV data by matching fields通过匹配字段聚合 CSV 数据
【发布时间】:2021-03-29 12:43:13
【问题描述】:

您好,我需要一些帮助,我有一个使用 gocsv 将其解析为结构的 csv 文件,我需要在该结构的各个切片上进行范围划分,并将每个切片的 DeductionCodes 与匹配的 EmployeeNumber 相结合,

这是 csv 结构。

type csvInput struct {
    EmployeeNumber string `json:"employeeNumber" csv:"Employee #"`
    DeductionCode  string `json:"deductionCode" csv:"Deduction Code"`
    Unit           string `json:"unit" csv:"Unit"`
    Amount         string `json:"amount" csv:"Amount"`
}

这就是我想要做的,我需要将所有的 deductionCodes 加入到一个数组中,每个切片都有一个匹配的employeeNumber,

var payTypes []string
    for _, csv := range csvData {
        for _, c := range csvData {
            if csv.EmployeeNumber == c.EmployeeNumber {
                if csv.DeductionCode == c.DeductionCode {
                    payTypes = append(payTypes, c.DeductionCode)
                    jsonData, _ := json.Marshal(payTypes)
                    println(string(jsonData))
                }
            }
        }
    }

这是 csv 文件的示例,请注意,我从 csv 本身中丢弃了大部分字段

Employee #,Employee Name,Deduction Code,Description,HED,Unit,Ceridian Amount,New Calculation,Amount,Company Matched T / F,Calculated Worked Hours T/F
1362,USER 1,LINSTAXBEN 364,Life Insurance Taxable Benefit,364,$,18.31,16.90,16.90,,
1362,USER 1,AD&DTAXBEN 366,AD &D taxable benefit,366,$,0.19,0.18,0.18,,
1362,USER 1,PENS COMP 550,Company Pension (Non Union),550,%,5.00,130.52,5.00,T,T
1362,USER 1,FT DENTALF 641,Dental F FT,641,$,32.78,30.26,30.26,,
1362,USER 1,LTD 660,Long Term Disability,660,$,38.97,35.97,35.97,,
1362,USER 1,RRSP 720,RRSP,720,$,75.00,75.00,75.00,,
1362,USER 1,DON CLOC 761,CLOC Donations,761,$,2.00,2.00,2.00,,
1362,USER 1,SOC 770,Social Club,770,$,2.00,2.00,2.00,,
8113,USER 2,LINSTAXBEN 364,Life Insurance Taxable Benefit,364,$,11.58,10.69,10.69,,
8113,USER 2,AD&DTAXBEN 366,AD &D taxable benefit,366,$,0.12,0.11,0.11,,
8113,USER 2,MSPP PENSF 552,MSPP Pension FT,552,%,5.00,82.86,5.00,T,T
8113,USER 2,Union DUES 580,Union Dues,580,%,1.50,26.93,1.50,,T
8113,USER 2,FT DENTALF 641,Dental F FT,641,$,32.78,30.26,30.26,,
8113,USER 2,LTD 660,Long Term Disability,660,$,38.97,35.97,35.97,,

我知道运行上面的双倍范围距离正确还有很长的路要走,因为它只是从两个员工中附加每个 deductionCode,我需要将 ALL Employee Number 1362 解析为 1 个带有 deductioncode 数组的结构切片,然后全部员工编号 8113 放入不同的切片中,并将其扣除代码作为数组。

如果有人需要查看更多代码,请告诉我。并且很抱歉我对 golang 很陌生,我相信有更好的方法来完成我需要的。

【问题讨论】:

    标签: go


    【解决方案1】:

    如果我理解正确,您需要一组独特的员工,每个员工都有一组扣除代码。我假设其他属性对于 csv 中的每个员工记录都是相同的。我喜欢在 go 中使用map,因为您可以轻松检查员工是否存在。我认为您还想为您的员工声明一个单独的类型:

    type Employee struct {
        Number, Unit, Amount string
        DeductionCodes       []string
    }
    

    您可能想利用这个机会将其他值转换为更有意义的类型。

    然后:

    employees := make(map[string]*Employee)
    
    for _, csv := range csvData {
        if _, ok := employees[csv.EmployeeNumber]; !ok {
            employees[csv.EmployeeNumber] = &Employee{
                Number:         csv.EmployeeNumber,
                Unit:           csv.Unit,
                Amount:         csv.Amount,
                DeductionCodes: make([]string, 0, 1),
            }
        }
        e := employees[csv.EmployeeNumber]
        e.DeductionCodes = append(e.DeductionCodes, csv.DeductionCode)
    }
    

    因此,如果已经遇到员工编号,您只需将扣减代码添加到现有员工即可。否则,您创建一个新的,然后添加它。

    【讨论】:

    • 好吧,试过了,我再次道歉,因为我对 golang 很陌生,我将这个范围更改为你上面的建议,我不需要这个特定步骤的单位或金额,因为我将使用EmployeeNumber 和 DeductionCode 数组作为 _id 的 mongo 聚合查找的一部分。但是在范围后面放一个简单的 json.Marshal 来查看它的样子,它没有向 deductionCodes 数组添加任何内容,它的空白 {"1362":{"number":"1362","deductionCodes":[" "]},"8113":{"number":"8113","deductionCodes":[""]}}
    • 我已经编辑了答案以使用指向 Employee 的指针。我认为这可能是您看到的问题。
    • 所以现在它在抱怨:不能使用 &(Employee literal) (value of type *Employee) 作为分配中的 Employee 值。这就是我仍在努力的地方,关于如何使用和使用什么以及何时大声笑,这对我来说是第 3 个导入应用程序,它让我变得更好。是的,你在每一行上面所说的都是相同的布局,所以你的假设是正确的。
    • 抱歉 - 忘记让切片也包含指向 Employee 的指针。错误告诉你!
    • 谢谢你的好先生,这很有效,学到了一些新东西,再次感谢。
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2019-03-12
    • 2021-09-10
    • 2021-04-07
    相关资源
    最近更新 更多