Golang导入CSV文件转换为指定格式Map的问题求助
问题排查与修复方案
问题1:file.Seek(0,0)未生效的误解
os.Open()打开的文件默认偏移量就在起始位置,不需要主动调用Seek(0,0)。你感知到"未生效"本质是CSV读取配置错误导致的:Go标准库encoding/csv默认的字段分隔符是逗号,,而你的CSV文件用的是竖线|作为分隔符,所以Reader会把每一行整行识别为单个字段,和Seek操作无关。
问题2:输出格式不符合预期的修复
你当前定义的返回值是[]map[string]string(字典切片,每行对应一个字典),而你需要的是外层单个大字典,key为第一列的取值,value为对应行col2、col3的组合,所以需要调整返回类型和字典构建逻辑。
修正后完整代码
package main import ( "encoding/csv" "fmt" "os" "strings" ) // 自定义结构体适配输出格式 type RowValue struct { Col2 string Col3 string } // 重写String方法,实现你要的{abc 123}格式输出 func (v RowValue) String() string { return fmt.Sprintf("{%s %s}", v.Col2, v.Col3) } func main() { m := CSVFileToMap() fmt.Println(m) } func CSVFileToMap() map[string]RowValue { filePath := "export.csv" csvfile, err := os.Open(filePath) if err != nil { return nil } defer csvfile.Close() reader := csv.NewReader(csvfile) // 配置CSV读取规则 reader.Comma = '|' // 指定分隔符为竖线 reader.TrimLeadingSpace = true // 自动去掉字段前的多余空格 rawCSVdata, err := reader.ReadAll() if err != nil { return nil } returnMap := make(map[string]RowValue) // 跳过表头行,从第二行开始读取 for i := 1; i < len(rawCSVdata); i++ { record := rawCSVdata[i] // 对每个字段做去空格处理 key := strings.TrimSpace(record[0]) col2 := strings.TrimSpace(record[1]) col3 := strings.TrimSpace(record[2]) returnMap[key] = RowValue{Col2: col2, Col3: col3} } return returnMap }
运行输出
map[key1:{abc 123} key2:{bcd 543} key3:{def 735}]
和你期望的输出完全一致。
内容的提问来源于stack exchange,提问作者AFHAM FARDEEN
相关产品推荐
相关产品推荐

