使用gocsv处理含重复列名的CSV文件时,如何避免重复列数据丢失?
使用gocsv处理含重复列名的CSV文件时,如何避免重复列数据丢失?
嘿,这个问题我刚好踩过坑!gocsv默认确实会合并重复列名的字段,导致数据丢失,但你提到的ShouldAlignDuplicateHeadersWithStructFieldOrder其实是管用的,只是你可能没正确配置它~
下面给你一步步讲怎么解决:
按列顺序定义结构体字段
给所有对应重复列的字段加上相同的csv标签,注意结构体字段的顺序必须和CSV里的列顺序完全对应。比如你的CSV列顺序是Name,Asset Type,Name,Asset Type,那结构体就要这么写:type AssetRecord struct { FirstName string `csv:"Name"` FirstAssetType string `csv:"Asset Type"` SecondName string `csv:"Name"` SecondAssetType string `csv:"Asset Type"` }启用重复列对齐配置
默认的gocsv.UnmarshalBytes()和gocsv.MarshalBytes()用的是默认配置,并没有开启ShouldAlignDuplicateHeadersWithStructFieldOrder。你需要创建自定义配置,开启这个选项,然后用带配置的专属函数来处理:// 创建默认配置并修改开关 config := gocsv.DefaultConfig() config.ShouldAlignDuplicateHeadersWithStructFieldOrder = true // 用带配置的Unmarshal解析CSV var records []AssetRecord err := gocsv.UnmarshalBytesWithConfig(yourCSVBytes, &records, config) if err != nil { // 处理错误逻辑 } // 同样,Marshal的时候也要用这个配置,才能输出重复列 outputBytes, err := gocsv.MarshalBytesWithConfig(&records, config) if err != nil { // 处理错误逻辑 }为什么之前配置没生效?
核心原因是你用了默认的UnmarshalBytes/MarshalBytes函数,这些函数不会读取你手动设置的配置。只有使用带WithConfig后缀的函数,才能让ShouldAlignDuplicateHeadersWithStructFieldOrder生效——开启后,gocsv会按照结构体字段的顺序,把CSV里的重复列依次映射到对应标签的字段上,第一个csv:"Name"对应CSV第一列Name,第二个对应第二列Name,完全不会覆盖或丢失数据。
备注:内容来源于stack exchange,提问作者Omortis
相关产品推荐
相关产品推荐

