Page 1 sur 1

proposition patch DataImporter.java

Posté : ven. déc. 15, 2017 2:01 pm
par tvans
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

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);


Re: proposition patch DataImporter.java

Posté : lun. févr. 12, 2018 8:22 pm
par sappas
C'est bien comme évolution, je pense qu'il serait judicieux d'ouvrir les possibilité d'importation, j'ai commencé plusieurs approches jbdc/obdc, en SQL, etc...
Ce logiciel est passionnant par certains de ses choix techniques et stratégiques

Re: proposition patch DataImporter.java

Posté : mar. févr. 13, 2018 9:58 am
par guillaume
Bonjour,

Pas evident d'intégrer votre modification, car createModelFromCSV est sensé prendre en entrée un fichier CSV
(cf https://fr.wikipedia.org/wiki/Comma-separated_values pour le détail).

Votre fichier n'étant pas un CSV, il faudrait plutôt le pré-traiter le fichier pour remplacer les tabulations par des virgules dans une autre fonction d'import.

Cordialement,

Re: proposition patch DataImporter.java

Posté : mer. mars 07, 2018 1:06 pm
par Samuel_Burg
Bonjour,

si votre fichier a des Tabulation comme séparateur et qu'il vient d'un cabinet de comptable c'est un fichier FEC.
il ne doit donc pas être importé avec un module CSV.

le mieux est de dupliquer le code de l'import de fichier CSV et d'en faire un import spécifique pour les fichiers FEC.

cordialement,

Samuel