Starter
This commit is contained in:
50001
50000 Records.csv
Normal file
50001
50000 Records.csv
Normal file
File diff suppressed because it is too large
Load Diff
22
README.md
Normal file
22
README.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Recrutement Challenge
|
||||||
|
## Introduction
|
||||||
|
Ce challenge a vocation à évaluer le niveau technique d'une personne souhaitant intégrer le BDOOC DATE DT COMCYBERGEND.
|
||||||
|
Ce challenge se décompose en 3 exercices.
|
||||||
|
- mise en forme de la donnée ;
|
||||||
|
- analyse et recherche dans la donnée ;
|
||||||
|
- visualisation de la donnée.
|
||||||
|
|
||||||
|
Les candidats doivent réaliser ce challenge et transmettre le code-source dans un délai de 7 jours.
|
||||||
|
|
||||||
|
## Population cible
|
||||||
|
### personnels civils catégorie A
|
||||||
|
Les candidats pour des postes de civil catégorie A devront réaliser ce challenge dans les langages de programmation employés au BDOOC :
|
||||||
|
- back-end : GOLANG ;
|
||||||
|
- front-end: SVELTE ;
|
||||||
|
- client : WAILS.
|
||||||
|
|
||||||
|
### personnels sous-officiers
|
||||||
|
Les militaires sous-officiers au BDOOC pourront réaliser ce challenge dans le langage de leur choix.
|
||||||
|
|
||||||
|
## Echange technique
|
||||||
|
Après avoir transmis le code-source, le candidat sera convoqué par le commandement du DATE pour réaliser un entretien technique. Cet échange permet de comprendre la manière dont le candidat a réalisé le challenge et d'identifier ses compétences et lacunes techniques.
|
||||||
240
main.go
Normal file
240
main.go
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/csv"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
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 {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
reader := csv.NewReader(f)
|
||||||
|
|
||||||
|
employees, err := UnmarshallEmployees(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)
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user