proposition patch DataImporter.java
Posté : ven. déc. 15, 2017 2:01 pm
Bonjour
je me suis retrouvé avec un mauvais délimiteur lors d'une tentative d'import d'écriture.
En lisant le code, je me suis aperçu que le test ne porte que sur ',' et ';', alors que mon fichier à importer (provenant d'un cabinet comptable) utilisait la tabulation comme séparateur.
je propose donc ce patch pour palier à ce problème, en rajoutant beaucoup plus de contrôle dans le choix automatique du délimiteur
dans la fonction createModelFromCSV
je me suis retrouvé avec un mauvais délimiteur lors d'une tentative d'import d'écriture.
En lisant le code, je me suis aperçu que le test ne porte que sur ',' et ';', alors que mon fichier à importer (provenant d'un cabinet comptable) utilisait la tabulation comme séparateur.
je propose donc ce patch pour palier à ce problème, en rajoutant beaucoup plus de contrôle dans le choix automatique du délimiteur
dans la fonction createModelFromCSV
Code : Tout sélectionner
char separator = ',';
int cCount = 0;
int scCount = 0;
int tabCount = 0;
int cCountCpt = 0;
int scCountCpt = 0;
int tabCountCpt = 0;
boolean separatorColon = false;
boolean separatorSemiColon = false;
boolean separatorTab = false;
for (int i = 0; i < l.length(); i++) {
int tempCCount = StringUtils.countMatches(l, ",");
int tempScCount = StringUtils.countMatches(l, ";");
int tempTabCount = StringUtils.countMatches(l, "\t");
System.out.println("TVS : recherche délimiteur : , :"+tempCCount+" / ; : "+tempScCount+" / tab : "+tempTabCount);
// test virgule
if (cCount == 0 && tempCCount> 0){
cCount = tempCCount;
separatorColon = true;
cCountCpt++;
}else if (separatorColon) {
if (cCount != tempCCount){
separatorColon = false;
}
cCountCpt++;
}
// test point virgule
if (scCount == 0 && tempScCount> 0){
scCount = tempScCount;
separatorSemiColon = true;
scCountCpt++;
}else if (separatorSemiColon) {
if (scCount != tempScCount){
separatorSemiColon = false;
}
scCountCpt++ ;
}
// test tabulation
if (tabCount == 0 && tempTabCount> 0){
tabCount = tempTabCount;
separatorTab = true;
tabCountCpt++;
}else if (separatorTab) {
if (tabCount != tempTabCount){
separatorTab = false;
}
tabCountCpt++;
}
}
r.close();
System.out.println("TVS : recherche délimiteur condition : , :"+separatorColon+" / ; : "+separatorSemiColon+" / tab : "+separatorTab+" / compteur : "+tabCountCpt+" / l : "+l.length());
// 1 seul doit être = true
boolean unique = false;
if (separatorColon){
if (!unique){
if (cCountCpt == l.length()){
separator = ',';
}
}
}
if (separatorSemiColon){
if (!unique){
if (scCountCpt == l.length()){
separator = ';';
unique = true;
}
} else {
JOptionPane.showMessageDialog(new JFrame(), "Erreur plusieurs possibilité de délimiteur");
}
}
if (separatorTab){
if (!unique){
if (tabCountCpt == l.length()){
separator = '\t';
unique = true;
}
} else {
JOptionPane.showMessageDialog(new JFrame(), "Erreur plusieurs possibilité de délimiteur");
}
}
System.out.println("TVS : délimiteur possibilité de délimiteur : "+separator);