proposition patch DataImporter.java

Répondre
tvans
Messages : 52
Enregistré le : mar. oct. 04, 2016 2:28 pm

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

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

sappas
Messages : 3
Enregistré le : jeu. févr. 01, 2018 6:36 pm

lun. févr. 12, 2018 8:22 pm

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
Avatar du membre
guillaume
Messages : 2429
Enregistré le : ven. févr. 11, 2011 7:15 pm

mar. févr. 13, 2018 9:58 am

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,
Directeur technique d'OpenConcerto qui dans son temps libre s'occupe du forum.
Pour une assistance pro, nous sommes joignables à ILM Informatique contre quelques jetons.
Pensez aussi à lire le manuel !
Samuel_Burg
Messages : 144
Enregistré le : mer. juil. 22, 2015 12:17 pm

mer. mars 07, 2018 1:06 pm

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
Répondre