Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bufio"
- "encoding/csv"
- "fmt"
- "io"
- "log"
- "os"
- )
- type StudentRecord struct {
- // Name string
- GradeLevel string
- CourseNum string
- CourseName string
- GradeLetter string
- Term string
- GradDate string
- }
- func main() {
- recordWithNames := make(map[string][]StudentRecord)
- csvFile, err := os.Open("grades.csv")
- if err != nil {
- log.Fatal("Error reading file, ", err)
- }
- reader := csv.NewReader(bufio.NewReader(csvFile))
- for {
- line, err := reader.Read()
- if err == io.EOF {
- break
- } else if err != nil {
- log.Fatal(err)
- }
- if _, ok := recordWithNames[line[0]]; !ok {
- studentRecord := StudentRecord{
- GradeLevel: line[1],
- CourseNum: line[2],
- CourseName: line[3],
- GradeLetter: line[4],
- Term: line[5],
- GradDate: line[6],
- }
- recordWithNames[line[0]] = append(recordWithNames[line[0]], studentRecord)
- } else {
- studentRecord := StudentRecord{
- GradeLevel: line[1],
- CourseNum: line[2],
- CourseName: line[3],
- GradeLetter: line[4],
- Term: line[5],
- GradDate: line[6],
- }
- recordWithNames[line[0]] = append(recordWithNames[line[0]], studentRecord)
- }
- }
- term1Record := make(map[string][]string)
- term2Record := make(map[string][]string)
- for name, records := range recordWithNames {
- for _, v := range records {
- if v.Term == "1" {
- term1Record[name] = append(term1Record[name], v.CourseName)
- term1Record[name] = append(term1Record[name], v.GradeLetter)
- } else {
- term2Record[name] = append(term2Record[name], v.CourseName)
- term2Record[name] = append(term2Record[name], v.GradeLetter)
- }
- }
- }
- // term1RecordChemistry := make(map[string][]string)
- // term1RecordChemistryH := make(map[string][]string)
- term1RecordChemistry, term1RecordChemistryH := formatTermRecord(term1Record)
- term2RecordChemistry, term2RecordChemistryH := formatTermRecord(term2Record)
- term1ChemistryResult := formatTermChemistry(term1RecordChemistry)
- term1ChemistryHresult := formatTermChemistry(term1RecordChemistryH)
- term2ChemistryResult := formatTermChemistry(term2RecordChemistry)
- term2ChemistryHresult := formatTermChemistry(term2RecordChemistryH)
- printOutput("Term 1: Chemistry: ", term1ChemistryResult)
- printOutput("Term 1: Chemistry H: ", term1ChemistryHresult)
- printOutput("Term 2: Chemistry: ", term2ChemistryResult)
- printOutput("Term 2: Chemistry H: ", term2ChemistryHresult)
- }
- func formatTermRecord(termRecord map[string][]string) (map[string][]string, map[string][]string) {
- term1RecordChemistry := make(map[string][]string)
- term1RecordChemistryH := make(map[string][]string)
- for _, r := range termRecord {
- // log.Println(r)
- var chGradeIndex int
- var chGradeIndex1 int
- for k, v := range r {
- if v == "Chemistry" {
- chGradeIndex = k + 1
- continue
- } else if v == "Chemistry H" {
- chGradeIndex1 = k + 1
- continue
- }
- if chGradeIndex != 0 {
- term1RecordChemistry[r[chGradeIndex]] = append(term1RecordChemistry[r[chGradeIndex]], v)
- } else if chGradeIndex1 != 0 {
- term1RecordChemistryH[r[chGradeIndex1]] = append(term1RecordChemistryH[r[chGradeIndex1]], v)
- }
- }
- }
- return term1RecordChemistry, term1RecordChemistryH
- }
- func formatTermChemistry(termRecordChemistry map[string][]string) map[string]map[string][]string {
- recordChemistryGrade := make(map[string]map[string][]string)
- for k, r := range termRecordChemistry {
- m := make(map[string][]string)
- // log.Println(k, r)
- if _, ok := recordChemistryGrade[k]; !ok {
- for k2, v := range r {
- // term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
- if len(v) > 2 {
- if _, ok2 := m[v]; !ok2 {
- m[v] = append(m[v], r[k2+1])
- } else {
- m[v] = append(m[v], r[k2+1])
- }
- }
- recordChemistryGrade[k] = m
- }
- } else {
- //this block is not needed
- log.Println("debug")
- for k2, v := range r {
- // term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
- if len(v) > 2 {
- if _, ok2 := m[v]; !ok2 {
- m[v] = append(m[v], r[k2+1])
- } else {
- m[v] = append(m[v], r[k2+1])
- }
- }
- recordChemistryGrade[k] = m
- }
- // for _, v := range r {
- // term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
- // }
- }
- }
- return recordChemistryGrade
- }
- func printOutput(chemistryType string, data map[string]map[string][]string) {
- for chGrade, record := range data {
- fmt.Printf(" %v Grade: %v", chemistryType, chGrade)
- for mathType, grades := range record {
- fmt.Printf(" Math type: %v ", mathType)
- count := countGrade(grades)
- for grade, num := range count {
- fmt.Printf(" Garde: %v Count %v", grade, num)
- }
- }
- fmt.Println()
- }
- }
- func countGrade(data []string) map[string]int {
- grades := make(map[string]int)
- for _, v := range data {
- if _, ok := grades[v]; !ok {
- grades[v] = 1
- } else {
- grades[v]++
- }
- }
- return grades
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement