Advertisement
Guest User

Untitled

a guest
Sep 11th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 5.03 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bufio"
  5.     "encoding/csv"
  6.     "fmt"
  7.     "io"
  8.     "log"
  9.     "os"
  10. )
  11.  
  12. type StudentRecord struct {
  13.     // Name        string
  14.     GradeLevel  string
  15.     CourseNum   string
  16.     CourseName  string
  17.     GradeLetter string
  18.     Term        string
  19.     GradDate    string
  20. }
  21.  
  22. func main() {
  23.  
  24.     recordWithNames := make(map[string][]StudentRecord)
  25.  
  26.     csvFile, err := os.Open("grades.csv")
  27.  
  28.     if err != nil {
  29.         log.Fatal("Error reading file, ", err)
  30.     }
  31.     reader := csv.NewReader(bufio.NewReader(csvFile))
  32.  
  33.     for {
  34.         line, err := reader.Read()
  35.         if err == io.EOF {
  36.             break
  37.         } else if err != nil {
  38.             log.Fatal(err)
  39.         }
  40.  
  41.         if _, ok := recordWithNames[line[0]]; !ok {
  42.             studentRecord := StudentRecord{
  43.                 GradeLevel:  line[1],
  44.                 CourseNum:   line[2],
  45.                 CourseName:  line[3],
  46.                 GradeLetter: line[4],
  47.                 Term:        line[5],
  48.                 GradDate:    line[6],
  49.             }
  50.  
  51.             recordWithNames[line[0]] = append(recordWithNames[line[0]], studentRecord)
  52.  
  53.         } else {
  54.             studentRecord := StudentRecord{
  55.                 GradeLevel:  line[1],
  56.                 CourseNum:   line[2],
  57.                 CourseName:  line[3],
  58.                 GradeLetter: line[4],
  59.                 Term:        line[5],
  60.                 GradDate:    line[6],
  61.             }
  62.  
  63.             recordWithNames[line[0]] = append(recordWithNames[line[0]], studentRecord)
  64.  
  65.         }
  66.  
  67.     }
  68.  
  69.     term1Record := make(map[string][]string)
  70.     term2Record := make(map[string][]string)
  71.  
  72.     for name, records := range recordWithNames {
  73.         for _, v := range records {
  74.             if v.Term == "1" {
  75.                 term1Record[name] = append(term1Record[name], v.CourseName)
  76.                 term1Record[name] = append(term1Record[name], v.GradeLetter)
  77.             } else {
  78.                 term2Record[name] = append(term2Record[name], v.CourseName)
  79.                 term2Record[name] = append(term2Record[name], v.GradeLetter)
  80.             }
  81.         }
  82.     }
  83.  
  84.     // term1RecordChemistry := make(map[string][]string)
  85.     // term1RecordChemistryH := make(map[string][]string)
  86.  
  87.     term1RecordChemistry, term1RecordChemistryH := formatTermRecord(term1Record)
  88.     term2RecordChemistry, term2RecordChemistryH := formatTermRecord(term2Record)
  89.  
  90.     term1ChemistryResult := formatTermChemistry(term1RecordChemistry)
  91.     term1ChemistryHresult := formatTermChemistry(term1RecordChemistryH)
  92.     term2ChemistryResult := formatTermChemistry(term2RecordChemistry)
  93.     term2ChemistryHresult := formatTermChemistry(term2RecordChemistryH)
  94.     printOutput("Term 1: Chemistry: ", term1ChemistryResult)
  95.     printOutput("Term 1: Chemistry H: ", term1ChemistryHresult)
  96.  
  97.     printOutput("Term 2: Chemistry: ", term2ChemistryResult)
  98.     printOutput("Term 2: Chemistry H: ", term2ChemistryHresult)
  99.  
  100. }
  101.  
  102. func formatTermRecord(termRecord map[string][]string) (map[string][]string, map[string][]string) {
  103.  
  104.     term1RecordChemistry := make(map[string][]string)
  105.     term1RecordChemistryH := make(map[string][]string)
  106.  
  107.     for _, r := range termRecord {
  108.         // log.Println(r)
  109.         var chGradeIndex int
  110.         var chGradeIndex1 int
  111.         for k, v := range r {
  112.             if v == "Chemistry" {
  113.                 chGradeIndex = k + 1
  114.                 continue
  115.             } else if v == "Chemistry H" {
  116.                 chGradeIndex1 = k + 1
  117.                 continue
  118.             }
  119.             if chGradeIndex != 0 {
  120.                 term1RecordChemistry[r[chGradeIndex]] = append(term1RecordChemistry[r[chGradeIndex]], v)
  121.             } else if chGradeIndex1 != 0 {
  122.                 term1RecordChemistryH[r[chGradeIndex1]] = append(term1RecordChemistryH[r[chGradeIndex1]], v)
  123.             }
  124.  
  125.         }
  126.     }
  127.  
  128.     return term1RecordChemistry, term1RecordChemistryH
  129. }
  130.  
  131. func formatTermChemistry(termRecordChemistry map[string][]string) map[string]map[string][]string {
  132.     recordChemistryGrade := make(map[string]map[string][]string)
  133.  
  134.     for k, r := range termRecordChemistry {
  135.         m := make(map[string][]string)
  136.         // log.Println(k, r)
  137.         if _, ok := recordChemistryGrade[k]; !ok {
  138.             for k2, v := range r {
  139.                 // term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
  140.                 if len(v) > 2 {
  141.                     if _, ok2 := m[v]; !ok2 {
  142.                         m[v] = append(m[v], r[k2+1])
  143.                     } else {
  144.                         m[v] = append(m[v], r[k2+1])
  145.                     }
  146.                 }
  147.                 recordChemistryGrade[k] = m
  148.             }
  149.         } else {
  150.             //this block is not needed
  151.             log.Println("debug")
  152.             for k2, v := range r {
  153.                 // term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
  154.                 if len(v) > 2 {
  155.                     if _, ok2 := m[v]; !ok2 {
  156.                         m[v] = append(m[v], r[k2+1])
  157.                     } else {
  158.                         m[v] = append(m[v], r[k2+1])
  159.                     }
  160.                 }
  161.                 recordChemistryGrade[k] = m
  162.             }
  163.             // for _, v := range r {
  164.             //  term1RecordHemistryGrade[k] = append(term1RecordHemistryGrade[k], v)
  165.             // }
  166.         }
  167.     }
  168.  
  169.     return recordChemistryGrade
  170. }
  171.  
  172. func printOutput(chemistryType string, data map[string]map[string][]string) {
  173.  
  174.     for chGrade, record := range data {
  175.  
  176.         fmt.Printf(" %v  Grade: %v", chemistryType, chGrade)
  177.  
  178.         for mathType, grades := range record {
  179.             fmt.Printf(" Math type: %v ", mathType)
  180.             count := countGrade(grades)
  181.             for grade, num := range count {
  182.                 fmt.Printf(" Garde: %v Count %v", grade, num)
  183.             }
  184.         }
  185.         fmt.Println()
  186.     }
  187.  
  188. }
  189.  
  190. func countGrade(data []string) map[string]int {
  191.     grades := make(map[string]int)
  192.  
  193.     for _, v := range data {
  194.         if _, ok := grades[v]; !ok {
  195.             grades[v] = 1
  196.         } else {
  197.             grades[v]++
  198.         }
  199.     }
  200.  
  201.     return grades
  202. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement