From 041c9378c7c6a310365e8ddfc26bc406833db8cf Mon Sep 17 00:00:00 2001 From: cdricms <36056008+cdricms@users.noreply.github.com> Date: Wed, 24 Apr 2024 21:03:51 +0200 Subject: [PATCH] Can now parse --- main.go | 219 +--------------------------------------- parsing/parsing.go | 129 +++++++++++++++++++++++ parsing/parsingEnums.go | 82 +++++++++++++++ 3 files changed, 214 insertions(+), 216 deletions(-) create mode 100644 parsing/parsing.go create mode 100644 parsing/parsingEnums.go diff --git a/main.go b/main.go index b3a7c8f..50377e7 100644 --- a/main.go +++ b/main.go @@ -2,213 +2,11 @@ package main import ( "encoding/csv" - "errors" "fmt" "os" - "reflect" - "strconv" + "git.cems.dev/cdricms/bdooc/parsing" ) -type Gender rune - -const ( - Male Gender = 'M' - Female Gender = 'F' -) - -type Quarter string - -const ( - QuarterOne Quarter = "Q1" - QuarterTwo Quarter = "Q2" - QuarterThree Quarter = "Q3" - QuarterFour Quarter = "Q4" -) - -type Half string - -const ( - HalfOne Half = "H1" - HalfTwo Half = "H2" -) - -type Month string - -const ( - January Month = "January" - February Month = "February" - March Month = "March" - April Month = "April" - May Month = "May" - June Month = "June" - July Month = "July" - August Month = "August" - September Month = "September" - October Month = "October" - November Month = "November" - December Month = "December" -) - -type MonthShort string - -const ( - Jan MonthShort = "Jan" - Feb MonthShort = "Feb" - Mar MonthShort = "Mar" - Apr MonthShort = "Apr" - MayShort MonthShort = "May" - Jun MonthShort = "Jun" - Jul MonthShort = "Jul" - Aug MonthShort = "Aug" - Sep MonthShort = "Sep" - Oct MonthShort = "Oct" - Nov MonthShort = "Nov" - Dec MonthShort = "Dec" -) - -type WeekDay string - -const ( - Monday WeekDay = "Monday" - Tuesday WeekDay = "Tuesday" - Wednesday WeekDay = "Wednesday" - Thursday WeekDay = "Thursday" - Friday WeekDay = "Friday" - Saturday WeekDay = "Saturday" - Sunday WeekDay = "Sunday" -) - -type WeekDayShort string - -const ( - Mon WeekDayShort = "Mon" - Tue WeekDayShort = "Tue" - Wed WeekDayShort = "Wed" - Thu WeekDayShort = "Thu" - Fri WeekDayShort = "Fri" - Sat WeekDayShort = "Sat" - Sun WeekDayShort = "Sun" -) - -type Employee struct { - EmpID uint `csv:"Emp ID"` - NamePrefix string `csv:"Name Prefix"` - FirstName string `csv:"First Name"` - MiddleInitial string `csv:"Middle Initial"` - LastName string `csv:"Last Name"` - Gender Gender `csv:"Gender"` - Email string `csv:"E Mail"` - FathersName string `csv:"Father's Name"` - MothersName string `csv:"Mothers's Name"` - MothersMaidenName string `csv:"Mother's Maiden Name"` - Birthdate string `csv:"Date of Birth"` - BirthTime string `csv:"Time of Birth"` - WeightKg uint16 `csv:"Weight in Kgs."` - JoiningDate string `csv:"Date of Joining"` - JoiningQuarter Quarter `csv:"Quarter of Joining"` - JoiningHalf Half `csv:"Half of Joining"` - JoiningYear uint16 `csv:"Year of Joining"` - JoiningMonth uint8 `csv:"Month of Joining"` - JoiningMonthName Month `csv:"Month Name of Joining"` - JoiningMonthNameShort MonthShort `csv:"Short Month"` - JoiningMonthDay uint8 `csv:"Day of Joining"` - JoiningWeekDay WeekDay `csv:"DOW of Joining"` - JoiningWeekDayShort WeekDayShort `csv:"Short DOW"` - YearsOfService float32 `csv:"Age in Company (Years)"` - Salary uint32 `csv:"Salary"` - LatestHikePercentage string `csv:"Last % Hike"` - SSN string `csv:"SSN"` - PhoneNumber string `csv:"Phone No."` - PlaceName string `csv:"Place Name"` - County string `csv:"County"` - City string `csv:"City"` - State string `csv:"State"` - Zip uint32 `csv:"Zip"` - Username string `csv:"User Name"` - Password string `csv:"Password"` - // Empty slot - // Empty slot - // Empty slot -} - -func UnmarshallEmployees(reader *csv.Reader) ([]Employee, error) { - reader.Comma = ',' - headers, err := reader.Read() - if err != nil { - return nil, errors.New("Couldn't read the headers.") - } - - fieldMap := make(map[string]int) - for i, header := range headers { - fieldMap[header] = i - } - - fmt.Println(fieldMap) - - var employees []Employee - for { - record, err := reader.Read() - if err != nil { - break - } - - employee := Employee{} - reflection := reflect.ValueOf(&employee).Elem() - // fmt.Println(reflection.FieldByName("Emp ID")) - for fieldName, index := range fieldMap { - field := reflection.FieldByName(fieldName) - fmt.Println(reflection.Field(2).Type()) - if field.IsValid() { - // fmt.Println("Field type: ", field.Type().Name(), fieldName) - switch field.Type().Name() { - case "string": - field.SetString(record[index]) - case "uint": - if intValue, err := strconv.ParseUint(record[index], 10, 64); err == nil { - field.SetUint(intValue) - } - case "uint8": - if intValue, err := strconv.ParseUint(record[index], 10, 8); err == nil { - field.SetUint(intValue) - } - case "uint16": - if intValue, err := strconv.ParseUint(record[index], 10, 16); err == nil { - field.SetUint(intValue) - } - case "uint32": - if intValue, err := strconv.ParseUint(record[index], 10, 32); err == nil { - field.SetUint(intValue) - } - case "float32": - if floatValue, err := strconv.ParseFloat(record[index], 32); err == nil { - field.SetFloat(floatValue) - } - case "Gender": - field.Set(reflect.ValueOf(Gender(rune(record[index][0])))) - case "Quarter": - field.Set(reflect.ValueOf(Quarter(string(record[index])))) - case "Half": - field.Set(reflect.ValueOf(Half(string(record[index])))) - case "Month": - field.Set(reflect.ValueOf(Month(string(record[index])))) - case "MonthShort": - field.Set(reflect.ValueOf(MonthShort(string(record[index])))) - case "WeekDay": - field.Set(reflect.ValueOf(WeekDay(string(record[index])))) - case "WeekDayShort": - field.Set(reflect.ValueOf(WeekDayShort(string(record[index])))) - } - } else { - // fmt.Println(fieldName) - } - - } - employees = append(employees, employee) - } - - return employees, nil -} - func main() { f, err := os.Open("50000 Records.csv") if err != nil { @@ -219,22 +17,11 @@ func main() { reader := csv.NewReader(f) - employees, err := UnmarshallEmployees(reader) + employees, err := parsing.UnmarshalEmployees(reader) if err != nil { fmt.Println(err) } - // pType := reflect.ValueOf(Employee{}) - // fmt.Println(pType.) - // // Iterate over the fields of the struct - // for i := 0; i < pType.NumField(); i++ { - // field := pType.Field(i) - // fmt.Printf("Field: %s, CSV Tag: %s\n", field.Name, field.Tag.Get("csv")) - // } - - fmt.Println(employees[:10]) - // for _, record := range records { - // fmt.Println(record) - // } + fmt.Println(employees[:10]) } diff --git a/parsing/parsing.go b/parsing/parsing.go new file mode 100644 index 0000000..9d57cfa --- /dev/null +++ b/parsing/parsing.go @@ -0,0 +1,129 @@ +package parsing + +import ( + "errors" + "encoding/csv" + "reflect" + "strconv" +) + +type Employee struct { + EmpID uint `csv:"Emp ID"` + NamePrefix string `csv:"Name Prefix"` + FirstName string `csv:"First Name"` + MiddleInitial string `csv:"Middle Initial"` + LastName string `csv:"Last Name"` + Gender Gender `csv:"Gender"` + Email string `csv:"E Mail"` + FathersName string `csv:"Father's Name"` + MothersName string `csv:"Mothers's Name"` + MothersMaidenName string `csv:"Mother's Maiden Name"` + Birthdate string `csv:"Date of Birth"` + BirthTime string `csv:"Time of Birth"` + WeightKg uint16 `csv:"Weight in Kgs."` + JoiningDate string `csv:"Date of Joining"` + JoiningQuarter Quarter `csv:"Quarter of Joining"` + JoiningHalf Half `csv:"Half of Joining"` + JoiningYear uint16 `csv:"Year of Joining"` + JoiningMonth uint8 `csv:"Month of Joining"` + JoiningMonthName Month `csv:"Month Name of Joining"` + JoiningMonthNameShort MonthShort `csv:"Short Month"` + JoiningMonthDay uint8 `csv:"Day of Joining"` + JoiningWeekDay WeekDay `csv:"DOW of Joining"` + JoiningWeekDayShort WeekDayShort `csv:"Short DOW"` + YearsOfService float32 `csv:"Age in Company (Years)"` + Salary uint32 `csv:"Salary"` + LatestHikePercentage string `csv:"Last % Hike"` + SSN string `csv:"SSN"` + PhoneNumber string `csv:"Phone No."` + PlaceName string `csv:"Place Name"` + County string `csv:"County"` + City string `csv:"City"` + State string `csv:"State"` + Zip uint32 `csv:"Zip"` + Region string `csv:"Region"` + Username string `csv:"User Name"` + Password string `csv:"Password"` + // Empty slot + // Empty slot + // Empty slot +} + +func UnmarshalEmployees(reader *csv.Reader) ([]Employee, error) { + reader.Comma = ',' + headers, err := reader.Read() + if err != nil { + return nil, errors.New("Couldn't read the headers.") + } + + e := Employee{} + refet := reflect.TypeOf(e) + tagMap := make(map[string]int) + headersLength := len(headers) + numFields := refet.NumField() + for i := 0; i < numFields && i < headersLength; i++ { + field := refet.Field(i) + if field.Tag.Get("csv") == headers[i] { + tagMap[field.Name] = i + } + } + + + var employees []Employee + for { + record, err := reader.Read() + if err != nil { + break + } + + employee := Employee{} + reflectionValue := reflect.ValueOf(&employee).Elem() + + for fieldName, index := range tagMap { + field := reflectionValue.FieldByName(fieldName) + if field.IsValid() { + switch field.Type().Name() { + case "string": + field.SetString(record[index]) + case "uint": + if intValue, err := strconv.ParseUint(record[index], 10, 64); err == nil { + field.SetUint(intValue) + } + case "uint8": + if intValue, err := strconv.ParseUint(record[index], 10, 8); err == nil { + field.SetUint(intValue) + } + case "uint16": + if intValue, err := strconv.ParseUint(record[index], 10, 16); err == nil { + field.SetUint(intValue) + } + case "uint32": + if intValue, err := strconv.ParseUint(record[index], 10, 32); err == nil { + field.SetUint(intValue) + } + case "float32": + if floatValue, err := strconv.ParseFloat(record[index], 32); err == nil { + field.SetFloat(floatValue) + } + case "Gender": + field.Set(reflect.ValueOf(Gender(rune(record[index][0])))) + case "Quarter": + field.Set(reflect.ValueOf(Quarter(string(record[index])))) + case "Half": + field.Set(reflect.ValueOf(Half(string(record[index])))) + case "Month": + field.Set(reflect.ValueOf(Month(string(record[index])))) + case "MonthShort": + field.Set(reflect.ValueOf(MonthShort(string(record[index])))) + case "WeekDay": + field.Set(reflect.ValueOf(WeekDay(string(record[index])))) + case "WeekDayShort": + field.Set(reflect.ValueOf(WeekDayShort(string(record[index])))) + } + } + } + employees = append(employees, employee) + } + + return employees, nil +} diff --git a/parsing/parsingEnums.go b/parsing/parsingEnums.go new file mode 100644 index 0000000..feaa035 --- /dev/null +++ b/parsing/parsingEnums.go @@ -0,0 +1,82 @@ +package parsing + +type Gender rune + +const ( + Male Gender = 'M' + Female Gender = 'F' +) + +type Quarter string + +const ( + QuarterOne Quarter = "Q1" + QuarterTwo Quarter = "Q2" + QuarterThree Quarter = "Q3" + QuarterFour Quarter = "Q4" +) + +type Half string + +const ( + HalfOne Half = "H1" + HalfTwo Half = "H2" +) + +type Month string + +const ( + January Month = "January" + February Month = "February" + March Month = "March" + April Month = "April" + May Month = "May" + June Month = "June" + July Month = "July" + August Month = "August" + September Month = "September" + October Month = "October" + November Month = "November" + December Month = "December" +) + +type MonthShort string + +const ( + Jan MonthShort = "Jan" + Feb MonthShort = "Feb" + Mar MonthShort = "Mar" + Apr MonthShort = "Apr" + MayShort MonthShort = "May" + Jun MonthShort = "Jun" + Jul MonthShort = "Jul" + Aug MonthShort = "Aug" + Sep MonthShort = "Sep" + Oct MonthShort = "Oct" + Nov MonthShort = "Nov" + Dec MonthShort = "Dec" +) + +type WeekDay string + +const ( + Monday WeekDay = "Monday" + Tuesday WeekDay = "Tuesday" + Wednesday WeekDay = "Wednesday" + Thursday WeekDay = "Thursday" + Friday WeekDay = "Friday" + Saturday WeekDay = "Saturday" + Sunday WeekDay = "Sunday" +) + +type WeekDayShort string + +const ( + Mon WeekDayShort = "Mon" + Tue WeekDayShort = "Tue" + Wed WeekDayShort = "Wed" + Thu WeekDayShort = "Thu" + Fri WeekDayShort = "Fri" + Sat WeekDayShort = "Sat" + Sun WeekDayShort = "Sun" +)