Can now parse
This commit is contained in:
219
main.go
219
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])
|
||||
|
||||
}
|
||||
|
||||
129
parsing/parsing.go
Normal file
129
parsing/parsing.go
Normal 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
82
parsing/parsingEnums.go
Normal 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"
|
||||
)
|
||||
Reference in New Issue
Block a user