Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Woody Woodpécore #33

Open
wants to merge 63 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
acfaab0
ajout du readme
maxdeschamps Jul 11, 2022
7f524eb
ajout du CleanerTest
maxence-deschamps Jul 11, 2022
7a51048
add test removedDuplicateVerifyFirstNameLastNameNicknamePseudoMailPhone
SonnySha Jul 11, 2022
b337f02
feat: email validator
theBatKwak Jul 11, 2022
2659fb3
ajout d'une méthode pour supprimer les doublons
maxence-deschamps Jul 11, 2022
0a03738
fix: merge conflicts
theBatKwak Jul 11, 2022
fddfa84
fix: merge conflicts
theBatKwak Jul 11, 2022
296f599
uncomment sonny test + funct
SonnySha Jul 11, 2022
a752a85
refactoRemoveDuplicateFirstNameLastNamePseudoMailPhone
SonnySha Jul 11, 2022
d4b43c8
add test RemovedDuplicateVerifyMailPhone
SonnySha Jul 11, 2022
cdf84a6
refacto removeDuplicateMailPhone
SonnySha Jul 11, 2022
3d7037c
add phonenumber cleaner
Jpbourdais Jul 11, 2022
e2564b7
reslov coflicts
Jpbourdais Jul 11, 2022
dcd09cc
refacto test RemovedDuplicateVerifyMailPhone
Jpbourdais Jul 11, 2022
be70d5b
Merge remote-tracking branch 'origin/master'
SonnySha Jul 11, 2022
4b1bcf3
resolve conflicts
maxence-deschamps Jul 11, 2022
6379f74
ajout de messages d'erreurs sur les asserts
maxence-deschamps Jul 11, 2022
4bcce4a
maj des umlaut_replacements
maxence-deschamps Jul 12, 2022
cdd247c
add tests sanitizeEmailInsteadOfPhone
SonnySha Jul 12, 2022
4bca100
Merge remote-tracking branch 'origin/master'
SonnySha Jul 12, 2022
c29b8bb
add test phone number valid
Jpbourdais Jul 12, 2022
f55b9cd
resolv conflicts
Jpbourdais Jul 12, 2022
3eb4cf1
change parameter Object to String for valid phone number
Jpbourdais Jul 12, 2022
24076d5
ajout d'une verfication des dupliqués lorsque le prénom et le nom son…
maxence-deschamps Jul 12, 2022
d407a22
Merge branch 'master' of github.com:maxdeschamps/volunteers into master
Jpbourdais Jul 12, 2022
5efcd69
fix test removeSpectialCharacters
maxence-deschamps Jul 12, 2022
d21efed
Merge remote-tracking branch 'origin/master'
maxence-deschamps Jul 12, 2022
cae3511
add test EmailInsteadOfPhone
SonnySha Jul 12, 2022
3bdd269
feat: email cleaner
theBatKwak Jul 12, 2022
82d91b6
fix: conflicts
theBatKwak Jul 12, 2022
7f0ef5c
fix regex phone
Jpbourdais Jul 12, 2022
79715e9
add phone tests valid
Jpbourdais Jul 12, 2022
490789c
Merge branch 'master' of github.com:maxdeschamps/volunteers into master
Jpbourdais Jul 12, 2022
a4f76c7
ajout de la méthode replacement des doublons au cleanUp
maxence-deschamps Jul 12, 2022
ec6885e
allégement de la liste de la méthode cleanUp
maxence-deschamps Jul 12, 2022
73d4ef0
fix CleanerTest
maxence-deschamps Jul 12, 2022
327540d
insert error message in EmailInsteadOfPhone
SonnySha Jul 12, 2022
976bf44
fix CleanerTest
maxence-deschamps Jul 12, 2022
98d50d9
refacto du cleanUpMethod
maxence-deschamps Jul 12, 2022
bd757cc
add cleanPhone
Jpbourdais Jul 12, 2022
1a0038a
Merge branch 'master' of github.com:maxdeschamps/volunteers into master
Jpbourdais Jul 12, 2022
f60e4b7
déplacement des tests dans des fichiers séparés
maxence-deschamps Jul 12, 2022
d17114b
déplacement de toutes les méthodes dans des classes spécifiques
maxence-deschamps Jul 12, 2022
9021deb
change test phone number
Jpbourdais Jul 12, 2022
8d1a917
add cleaner
Jpbourdais Jul 12, 2022
5c581f9
reslov conflict
Jpbourdais Jul 12, 2022
64d3ae0
add phone test and refacto
Jpbourdais Jul 12, 2022
c1d391f
add cleanupPhoneNumber
Jpbourdais Jul 12, 2022
71c1233
utilisation de plus de méthodes dans cleanUp et commit du output.csv
maxence-deschamps Jul 12, 2022
4de6ea7
test de suppression des accents
maxence-deschamps Jul 12, 2022
3841acb
ajout d'un updateCaseInNames
maxence-deschamps Jul 12, 2022
9bf4634
fix du updateCaseInNames
maxence-deschamps Jul 12, 2022
48b79f5
fix du updateCaseInNames
maxence-deschamps Jul 12, 2022
dc994ab
fix du updateCaseInNames
maxence-deschamps Jul 12, 2022
b11dc07
update output.csv
maxence-deschamps Jul 12, 2022
edc309c
main with 2 output
SonnySha Jul 12, 2022
2a431f8
fix: email spaces
theBatKwak Jul 12, 2022
643fc46
fix: merge error
theBatKwak Jul 12, 2022
dcdefd0
change readme
Jpbourdais Jul 12, 2022
b67e5eb
change code class
Jpbourdais Jul 12, 2022
00e05b1
add new output
Jpbourdais Jul 12, 2022
d24a8b7
add new tests for concat data
Jpbourdais Jul 12, 2022
963e4d0
Merge branch 'master' of github.com:maxdeschamps/volunteers into master
Jpbourdais Jul 12, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/.idea/
/target/
/tags

17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Woody Woodpécore

* Jean-Philippe Bourdais
* Sonny Chaprier
* Maxence Deschamps
* Robin Oger

## Ficher output.csv
Le fichier nettoie les données et enlève les doublons
des volontaires qui ont complétement les mêmes données ou
par rapport aux données des emails et des téléphones.

## Fichier outputUnique.csv
Le fichier reprend les même données du fichier output.csv et en
plus pour tous les volontaires qui ont le même prénom, le même
nom et le même pseudo les données des emails et des téléphones
sont concaténées si elles sont différentes.
6 changes: 6 additions & 0 deletions pom.xml
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/App.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,23 @@ public static void main(String[] args) throws IOException {
.map(tokens -> new Volunteer(tokens.get(0), tokens.get(1), tokens.get(2), tokens.get(3), tokens.get(4)))
.collect(toList());

List<Volunteer> outputVolunteers = Cleaner.cleanUp(inputVolunteers);
List<Volunteer> inputVolunteersForUnique = Files.readAllLines(Paths.get(args[0])).stream()
.map(string -> Arrays.stream(string.split(";", -1))
.map(token -> quotes.matcher(token).replaceAll("$1"))
.collect(toList()))
.map(tokens -> new Volunteer(tokens.get(0), tokens.get(1), tokens.get(2), tokens.get(3), tokens.get(4)))
.collect(toList());

List<Volunteer> outputVolunteers = Cleaner.cleanUp(inputVolunteers);
List<Volunteer> outputVolunteersUnique = Cleaner.cleanUpUniqueContact(inputVolunteersForUnique);
System.out.println(outputVolunteers);
System.out.println(outputVolunteersUnique);
PrintWriter writer = new PrintWriter(new FileWriter("src/main/resources/output.csv"));
PrintWriter writerUnique = new PrintWriter(new FileWriter("src/main/resources/outputUnique.csv"));

outputVolunteers.forEach(writer::println);
outputVolunteersUnique.forEach(writerUnique::println);
writer.close();
writerUnique.close();
}
}
78 changes: 75 additions & 3 deletions src/main/java/org/example/volunteers/Cleaner.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,81 @@
import java.util.List;

public class Cleaner {
private static final String[][] UMLAUT_REPLACEMENTS = { { "É", "E" }, { "é", "e" }, { "È", "E" }, { "è", "e" } };

public static List<Volunteer> cleanUp(List<Volunteer> volunteers) {
// This function should contain your dark magic.
// For now, it simply returns a copy of the initial list.
return new ArrayList<>(volunteers);
volunteers = removeAccents(volunteers);
volunteers = sanitizeEmailInsteadOfPhone(volunteers);
volunteers = Email.cleanupMailAddresses(volunteers);
volunteers = Phone.cleanupPhoneNumber(volunteers);
volunteers = updateCaseInNames(volunteers);
volunteers = Duplicate.removeDuplicateFirstNameLastNamePseudoMailPhone(volunteers);
volunteers = Duplicate.removeDuplicateMailPhone(volunteers);
return new ArrayList<Volunteer>(volunteers);
}
public static List<Volunteer> cleanUpUniqueContact(List<Volunteer> volunteers) {
volunteers = removeAccents(volunteers);
volunteers = sanitizeEmailInsteadOfPhone(volunteers);
volunteers = Email.cleanupMailAddresses(volunteers);
volunteers = Phone.cleanupPhoneNumber(volunteers);
volunteers = updateCaseInNames(volunteers);
volunteers = Duplicate.removeDuplicateFirstNameLastNamePseudoMailPhone(volunteers);
volunteers = Duplicate.concatDuplicateMailPhone(volunteers);
return new ArrayList<Volunteer>(volunteers);
}

public static List<Volunteer> removeAccents(List<Volunteer> volunteers) {
List<Volunteer> cleanedVolunteers = new ArrayList<>();

for (Volunteer volunteer: volunteers) {
String firstName = volunteer.firstName;
String lastName = volunteer.lastName;
String nickName = volunteer.nickName;

for (String[] umlautReplacement : UMLAUT_REPLACEMENTS) {
firstName = firstName.replaceAll(umlautReplacement[0], umlautReplacement[1]);
lastName = lastName.replaceAll(umlautReplacement[0], umlautReplacement[1]);
nickName = nickName.replaceAll(umlautReplacement[0], umlautReplacement[1]);
}

cleanedVolunteers.add(new Volunteer(firstName, lastName, nickName, volunteer.eMail, volunteer.phone));
}

return cleanedVolunteers;
}

public static List<Volunteer> sanitizeEmailInsteadOfPhone(List<Volunteer> volunteers) {
for (Volunteer volunteer: volunteers) {
if (Phone.isValidPhoneNumber(volunteer.eMail)) {
String oldMailHasPhone = volunteer.eMail;
String oldPhoneHasMail = volunteer.phone;
volunteer.phone = oldMailHasPhone;
volunteer.eMail = oldPhoneHasMail;
}
}

return volunteers;
}

public static List<Volunteer> updateCaseInNames(List<Volunteer> volunteers) {
List<Volunteer> cleanedVolunteers = new ArrayList<>();

List<String> characters = new ArrayList<>();

for (Volunteer volunteer: volunteers) {
String cleanedVolunteerFirstName = volunteer.firstName.length() > 1
? volunteer.firstName.substring(0, 1).toUpperCase() + volunteer.firstName.substring(1).toLowerCase()
: volunteer.firstName.toLowerCase();

String cleanedVolunteerLastName = volunteer.lastName.length() > 1
? volunteer.lastName.substring(0, 1).toUpperCase() + volunteer.lastName.substring(1).toLowerCase()
: volunteer.lastName.toLowerCase();

String cleanedVolunteerNickName = volunteer.nickName.toLowerCase();

cleanedVolunteers.add(new Volunteer(cleanedVolunteerFirstName, cleanedVolunteerLastName, cleanedVolunteerNickName, volunteer.eMail, volunteer.phone));
}

return cleanedVolunteers;
}
}
66 changes: 66 additions & 0 deletions src/main/java/org/example/volunteers/Duplicate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.example.volunteers;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

public class Duplicate {
public static List<Volunteer> removeDuplicateFirstNameLastNamePseudoMailPhone(List<Volunteer> volunteers) {
List<Volunteer> uniqueVolunteers = new ArrayList<>();
LinkedHashSet<String> linkedsetVolunteers = new LinkedHashSet<String>();

for (Volunteer volunteer: volunteers) {
Volunteer reversedVolunteer = new Volunteer(volunteer.lastName, volunteer.firstName, volunteer.nickName, volunteer.eMail, volunteer.phone);
if(!(linkedsetVolunteers.contains(volunteer.toString()) || linkedsetVolunteers.contains(reversedVolunteer.toString()))) {
linkedsetVolunteers.add(volunteer.toString());
uniqueVolunteers.add(volunteer);
}
}

return uniqueVolunteers;
}

public static List<Volunteer> removeDuplicateMailPhone(List<Volunteer> volunteers) {
List<Volunteer> uniqueVolunteers = new ArrayList<>();
LinkedHashSet<String> linkedsetVolunteers = new LinkedHashSet<String>();

for (Volunteer volunteer: volunteers) {
String volunteerStringTest = volunteer.eMail + ";" + volunteer.phone;

if (!linkedsetVolunteers.contains(volunteerStringTest)) {
linkedsetVolunteers.add(volunteerStringTest);
uniqueVolunteers.add(volunteer);
}
}

return uniqueVolunteers;
}

public static List<Volunteer> concatDuplicateMailPhone(List<Volunteer> volunteers) {
List<Volunteer> uniqueVolunteers = new ArrayList<>();

for (Volunteer volunteer: volunteers) {
List<Volunteer> findedVolunteers = uniqueVolunteers.stream().filter(
(Volunteer v) -> (Objects.equals(v.firstName, volunteer.firstName)
&& Objects.equals(v.lastName, volunteer.lastName)
&& Objects.equals(v.nickName, volunteer.nickName))
).collect(Collectors.toList());

if (findedVolunteers.size() == 0) {
uniqueVolunteers.add(volunteer);
} else {
Volunteer volunteerConcact = findedVolunteers.get(0);
if (!volunteerConcact.eMail.contains(volunteer.eMail) && !volunteerConcact.eMail.isEmpty()) {
volunteerConcact.setEMail(volunteerConcact.eMail + "," + volunteer.eMail);
}
if (!volunteerConcact.phone.contains(volunteer.phone) && !volunteerConcact.phone.isEmpty()) {
volunteerConcact.setPhone(volunteerConcact.phone + "," + volunteer.phone);
}
}
}

return uniqueVolunteers;
}
}
46 changes: 46 additions & 0 deletions src/main/java/org/example/volunteers/Email.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package org.example.volunteers;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class Email {
public static Boolean isValidEmail(String email) {
return Pattern.matches("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$", email);
}

public static String cleanEmailAddress(String email) {
email = email.toLowerCase();
email = email.replaceAll("é", "e");
email = email.replaceAll("è", "e");
email = email.replaceAll("ê", "e");
email = email.replaceAll("œ", "oe");
email = email.replaceAll("ë", "e");
email = email.replaceAll("à", "a");
email = email.replaceAll("ä", "a");
email = email.replaceAll("â", "a");
email = email.replaceAll("î", "i");
email = email.replaceAll("ï", "i");
email = email.replaceAll("ì", "i");
email = email.replaceAll("û", "u");
email = email.replaceAll("ù", "u");
email = email.replaceAll("ü", "u");
email = email.replaceAll("ô", "o");
email = email.replaceAll("ò", "o");
email = email.replaceAll("ö", "o");
return email;
}

public static List<Volunteer> cleanupMailAddresses(List<Volunteer> volunteers) {
List<Volunteer> cleanedVolunteers = new ArrayList<>();
for(Volunteer volunteer: volunteers) {
String cleanEmail = "";
String sanitizedEmail = cleanEmailAddress(volunteer.eMail);
if (isValidEmail(sanitizedEmail)) {
cleanEmail = sanitizedEmail;
}
cleanedVolunteers.add(new Volunteer(volunteer.firstName, volunteer.lastName, volunteer.nickName, cleanEmail, volunteer.phone));
}
return cleanedVolunteers;
}
}
47 changes: 47 additions & 0 deletions src/main/java/org/example/volunteers/Phone.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.example.volunteers;

import java.util.regex.Pattern;

import java.util.ArrayList;
import java.util.List;


public class Phone {

// Phone
public static List<Volunteer> cleanupPhoneNumber(List<Volunteer> volunteers) {
List<Volunteer> cleanedVolunteers = new ArrayList<>();
for(Volunteer volunteer: volunteers) {
String cleanPhoneNumber = "";
String sanitizedPhoneNumber = cleanPhoneNumber(volunteer.phone);
if (isValidPhoneNumber(sanitizedPhoneNumber)) {
cleanPhoneNumber = sanitizedPhoneNumber;
}
cleanedVolunteers.add(new Volunteer(volunteer.firstName, volunteer.lastName, volunteer.nickName, volunteer.eMail, cleanPhoneNumber));
}
return cleanedVolunteers;
}

public static Boolean isValidPhoneNumber(String phoneNumber) {
return Pattern.matches("^[\\+][1-9][0-9]?[0-9]?[0-9]{9}$", phoneNumber);
}

public static String cleanPhoneNumber(String phoneNumber) {
// Remove Characters
phoneNumber = phoneNumber.replace("-", "");
phoneNumber = phoneNumber.replace(".", "");
phoneNumber = phoneNumber.replace(" ", "");
phoneNumber = phoneNumber.replace("(0)", "");
phoneNumber = phoneNumber.replace("(", "").replace(")", "");

// Change Beginning and add default country code
if (phoneNumber.length() == 10) {
if (phoneNumber.charAt(0) == '0') {
phoneNumber = phoneNumber.replaceFirst("0", "+33");
}
} else if (phoneNumber.length() == 9 && phoneNumber.charAt(0) != '+') {
phoneNumber = "+33" + phoneNumber;
}
return phoneNumber;
}
}
13 changes: 11 additions & 2 deletions src/main/java/org/example/volunteers/Volunteer.java
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,17 @@ public final class Volunteer {
public final String firstName;
public final String lastName;
public final String nickName;
public final String eMail;
public final String phone;

public void setEMail(String eMail) {
this.eMail = eMail;
}

public void setPhone(String phone) {
this.phone = phone;
}

public String eMail;
public String phone;

public Volunteer(
String firstName,
Expand Down
Empty file modified src/main/resources/data.csv
100644 → 100755
Empty file.
Loading