Can now parse

This commit is contained in:
cdricms
2024-04-24 21:03:51 +02:00
parent a1a4a3e8b6
commit 041c9378c7
3 changed files with 214 additions and 216 deletions

219
main.go
View File

@@ -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])
}

129
parsing/parsing.go Normal file
View File

@@ -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
}

82
parsing/parsingEnums.go Normal file
View File

@@ -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"
)