package main import ( "integrity-checkin/dao" "integrity-checkin/data/po" "io" "os" "sort" ) type UserActivityWithRealName struct { RealName string `json:"real_name"` po.UserActivity } func main() { dao.Setup() var userActivities []UserActivityWithRealName err := dao.DB.Raw("select u.real_name,ua.* from user_activity ua " + " left join users u on u.id=ua.user_id where u.type=2").Find(&userActivities).Error if err != nil { panic(err) } days := map[string]struct{}{} teacherDays := map[string]map[string]struct{}{} for _, userActivity := range userActivities { if _, ok := days[userActivity.Day]; !ok { days[userActivity.Day] = struct{}{} } if teacherDays[userActivity.RealName] == nil { teacherDays[userActivity.RealName] = map[string]struct{}{} } teacherDays[userActivity.RealName][userActivity.Day] = struct{}{} } var daysArr []string for day := range days { daysArr = append(daysArr, day) } sort.Slice(daysArr, func(i, j int) bool { return daysArr[i] < daysArr[j] }) f, err := os.OpenFile("out.csv", os.O_WRONLY|os.O_CREATE, 0644) if err != nil { panic(err) } io.WriteString(f, "姓名") for _, day := range daysArr { io.WriteString(f, ","+day) } io.WriteString(f, "\n") for teacherName, teacherMap := range teacherDays { io.WriteString(f, teacherName) for _, day := range daysArr { if _, ok := teacherMap[day]; ok { io.WriteString(f, ",1") } else { io.WriteString(f, ",0") } } io.WriteString(f, "\n") } }