PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Supprimer doublons dans un champ table
Supprimer doublons dans un champ table
Débuté par Fany, 03 juin 2015 16:51 - 12 réponses
Membre enregistré
365 messages
Posté le 03 juin 2015 - 16:51
Bonjour à tous,
Je bloque sur quelque chose qui ne semble pas compliqué.

J'ai un champ table dans lequel je viens entrer les des lignes. Parfois, certains enregistrements peuvent être identiques.
Pour simplifier, actuellement j'ai ça :

[Ref] [Hauteur] [Longueur]
A1 216 700
A1 216 700
A1 300 800
A2 300 450

Et je voudrais avoir :
[Ref] [Hauteur] [Longueur]
A1 216 700
A1 300 800
A2 300 450

Je remplis mon tableau depuis un fichier csv :
POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
FIN
FIN
FIN


J'ai vraiment tout essayé, vraiment, j'ai perdu un temps fou à faire 3 milles essais jamais concluants.... c'est atroce moralement.

J'ai bien évidement essayé d'utiliser la fonction tablecherche(), mais le problème c'est que ma recherche s'arrête sur le premier élement trouvé du tableau, et ne vas pas vérifier les autres enregistrements (mon code ci dessous ne fonctionne pas complètement car je n'ai pas réussi à boucler ma comparaison sur tous les enregistrements de ma table). Je vous le mets quand même, si on peux partir de ça pour trouver une solution à mon problème :

POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")


nDoublon est un entier = TableCherche(TABLE_Configuration.COL_RefModule,sRefModule)
//Si on trouve une réference identique
SI nDoublon <> -1 ALORS
SI TABLE_Configuration[nDoublon].COL_Hauteur = sHauteur ET TABLE_Configuration[nDoublon].COL_Longueur ALORS
//ref, hauteur et longueur identique
SINON
//On a trouvé une ref identique, mais pas la même hauteur et largeur
TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
FIN
//Si on a pas trouvé de réfénce identique
SINON
TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
FIN
FIN
FIN
FIN


Alors il y a une autre solution, qui consiste à passer par une colonne cachée ou je ferai une sorte de clé composé avec Ref+Hauteur+Longueur et je ferai ma recherche sur cette colonne... mais pour que vous puissiez comprendre, j'ai énormément simplifié ma table, et je fais des recherches sur bcp d'autre colonnes (epaisseur, finition, couleur...) et je me vois mal faire une maxi clé composée...

Il doit bien y avoir une meilleur technique.

Je m'en remets dons encore une fois à vos conseils pour pouvoir avancer sur ce point qui me bloque.

D'avance merci !!!

Fany
Posté le 03 juin 2015 - 17:04
Le plus judicieux serait de tester les doublons lors de la récupération du .csv.
Avant chaque ajout dans la table, chercher si l'élément existe dans la dite table
avant de faire l'ajout, et le tour est joué.
Membre enregistré
204 messages
Posté le 03 juin 2015 - 17:36
bonjour,

je m'y prendrais de la façon suivante :

je crée un tableau de chaine
LeTabCompose est un tableau de chaines

je mets dedans une clé composée :
cleCompo est une chaine


Je commence la lecture de mon fichier
POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")

cleCompo = sRefModule +sHauteur +sLongueur

je fais une recherche dans mon tableau pour voir si cet élément figure déjà
Indice est un entier=-1
Si LeTabCompose..Occurrence > 0 Alors
Indice = TableauCherche(LeTabCompose, tclineaire,cleCompo)
Fin

Si Indice=-1 Alors
// j'ajoute le nouvel élément au tableau
// et dans ma table les 4 éléments

Ajoute(LeTabCompos,CleCompo)
TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)


//Sinon
// je passe à l'enregistrement suivant
Fin

//Et je boucle
Fin
Fin

J'espère que ça peut t'aider (j'ai rédigé à la volée, il y a sans doute de petites erreurs ci et là)
cordlt
Christophe
Membre enregistré
326 messages
Posté le 03 juin 2015 - 17:58
Bonsoir.

-> le truc classique : tu ajoutes toujours la première ligne : tu stockes ta clé
-> pour les lignes suivantes tu compares à ta clé -> si pareil tu passes si différente tu ajoutes et tu re-stockes ta clé...

un bout de code ci-dessous (je ne sais pas pourquoi tu commence à la ligne 3 mais bon ....

Michel.


sRefModule est une chaîne
sQuantite est une chaîne
sHauteur est une chaîne
sLongueur est une chaîne
ma_cle_lue est une chaîne

// ligne 1

POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
// ligne 1
SI i = 3 // ta valeur de i pour première ligne à priori 3 pour toi
ma_cle_lue = ExtraitChaîne(sLigneFichier,1,";") + ExtraitChaîne(sLigneFichier,2,";") + ExtraitChaîne(sLigneFichier,5,";")+ ExtraitChaîne(sLigneFichier,5,";")
sRefModule = ExtraitChaîne(sLigneFichier,1,";")
sQuantite = ExtraitChaîne(sLigneFichier,2,";")
sHauteur = ExtraitChaîne(sLigneFichier,5,";")
sLongueur = ExtraitChaîne(sLigneFichier,6,";")

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
ma_cle_lue = ExtraitChaîne(sLigneFichier,1,";") + ExtraitChaîne(sLigneFichier,2,";") + ExtraitChaîne(sLigneFichier,5,";")+ ExtraitChaîne(sLigneFichier,5,";")

SINON
SI ma_cle_lue <> ExtraitChaîne(sLigneFichier,1,";") + ExtraitChaîne(sLigneFichier,2,";") + ExtraitChaîne(sLigneFichier,5,";")+ ExtraitChaîne(sLigneFichier,5,";") ALORS

sRefModule = ExtraitChaîne(sLigneFichier,1,";")
sQuantite = ExtraitChaîne(sLigneFichier,2,";")
sHauteur = ExtraitChaîne(sLigneFichier,5,";")
sLongueur = ExtraitChaîne(sLigneFichier,6,";")

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
ma_cle_lue = ExtraitChaîne(sLigneFichier,1,";") + ExtraitChaîne(sLigneFichier,2,";") + ExtraitChaîne(sLigneFichier,5,";")+ ExtraitChaîne(sLigneFichier,5,";")


FIN
FIN
FIN
Posté le 03 juin 2015 - 20:40
Bonjour Fany,

Si le CSV n'est pas gigantesque, voici comment je ferais ;-)

Local
nPos est un entier = 0
sDéjà est une chaine = ""


POUR TOUT CHAÎNE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne =
ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")

nPos = Position(sDéjà,"["+sLigneFichier+"]")
si nPos = 0 alors
TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur,
sLongueur)
sDéjà += "["+sLigneFichier+"]"
Fin

FIN
FIN
FIN

Bien à toi,
Fabrice De Weerd
www.fawax.com/dev


Le 03-06-15 14:51, Fany a écrit :
Bonjour à tous, Je bloque sur quelque chose qui ne semble pas compliqué.

J'ai un champ table dans lequel je viens entrer les des lignes. Parfois,
certains enregistrements peuvent être identiques. Pour simplifier,
actuellement j'ai ça :

[Ref] [Hauteur] [Longueur]
A1 216 700
A1 216 700
A1 300 800 A2 300 450

Et je voudrais avoir :
[Ref] [Hauteur] [Longueur]
A1 216 700
A1 300 800 A2 300 450

Je remplis mon tableau depuis un fichier csv :
POUR TOUT CHAÎNE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur,
sLongueur)
FIN
FIN
FIN


J'ai vraiment tout essayé, vraiment, j'ai perdu un temps fou à faire 3
milles essais jamais concluants.... c'est atroce moralement.
J'ai bien évidement essayé d'utiliser la fonction tablecherche(), mais
le problème c'est que ma recherche s'arrête sur le premier élement
trouvé du tableau, et ne vas pas vérifier les autres enregistrements
(mon code ci dessous ne fonctionne pas complètement car je n'ai pas
réussi à boucler ma comparaison sur tous les enregistrements de ma
table). Je vous le mets quand même, si on peux partir de ça pour trouver
une solution à mon problème :

POUR TOUT CHAÎNE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")


nDoublon est un entier =
TableCherche(TABLE_Configuration.COL_RefModule,sRefModule)
//Si on trouve une réference identique
SI nDoublon <> -1 ALORS
SI TABLE_Configuration[nDoublon].COL_Hauteur = sHauteur
ET TABLE_Configuration[nDoublon].COL_Longueur ALORS
//ref, hauteur et longueur identique
SINON
//On a trouvé une ref identique,
mais pas la même hauteur et largeur

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
FIN
//Si on a pas trouvé de réfénce identique
SINON

TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur)
FIN
FIN
FIN
FIN


Alors il y a une autre solution, qui consiste à passer par une colonne
cachée ou je ferai une sorte de clé composé avec Ref+Hauteur+Longueur et
je ferai ma recherche sur cette colonne... mais pour que vous puissiez
comprendre, j'ai énormément simplifié ma table, et je fais des
recherches sur bcp d'autre colonnes (epaisseur, finition, couleur...) et
je me vois mal faire une maxi clé composée...

Il doit bien y avoir une meilleur technique.

Je m'en remets dons encore une fois à vos conseils pour pouvoir avancer
sur ce point qui me bloque.

D'avance merci !!!

Fany
Membre enregistré
186 messages
Posté le 04 juin 2015 - 10:02
Salut,
Tu a un soucis sur ton SI tout simplement.
Tu testes ta colonne COL_Longueur mais tu ne la compare pas à la valeur stockée dans sLongueur...
Ensuite tes données sont des chaines mais contiennent des valeurs numériques donc je ne sais pas comment est fait ton fichier CSV mais je blinderai un peu plus le test de ton SI.
Par exemple si tu veux conserver des chaines compare :
SI SansEspace(TABLE_Configuration[nDoublon].COL_Hauteur) = SansEspace(sHauteur) ET SansEspace(TABLE_Configuration[nDoublon].COL_Longueur) = SansEspace(sLongueur) ALORS
...


Ou sinon puisque ce sont des hauteurs et des largeurs, donc des numériques transfrome sHauteur et sLongueur et les colonnes COL_Hauteur et COL_Longueur en entier (ou réel selon tes besoins) et compare les valeurs.
Ce qui donnerait :
SI TABLE_Configuration[nDoublon].COL_Hauteur = Val(sHauteur) ET TABLE_Configuration[nDoublon].COL_Longueur = Val(sLongueur) ALORS
...


Bon courage

--
Seb
Membre enregistré
365 messages
Posté le 04 juin 2015 - 11:14
Bonjour à tous et merci pour vos réponses !

J'ai choisi d'utiliser la solution de Christophe que j'ai testé et qui fonctionne très bien. Un grand merci.
Cependant, j'aurai une autre question... j'ai essayé d'adapter votre code pour résoudre le problème moi même mais je n'ai pas réussi. Ce que je n'ai pas précisé (je ne voulais pas compliquer ma demande, mais là je coince...) c'est que j'ai une autre colonne dans mon tableau qui concerne les quantités. Si je reprends mon exemple de tableau :

[Ref] [Hauteur] [Longueur] [Quantite]
A1 216 700 5
A1 216 700 6
A1 300 800 1
A2 300 450 2

Je voudrais obtenir :
[Ref] [Hauteur] [Longueur] [Quantite]
A1 216 700 11 <-- addition de 5 + 6
A1 300 800 1
A2 300 450 2

(je voudrais pouvoir additionner mes quantités)

Donc au lieu de passer par un tableau à une dimension, j'ai essayé de passer par un tableau à deux dimensions, pour rajouter à chaque ligne de mon "tableau de tableau d'entiers" le numéro de la ligne de mon champ table correspondant à la clé composée recherchée (sRefModule+sHauteur+sLongueur), pour retrouver la quantité et lui ajouter la nouvelle quantite
Comme ça je n'aurai plus à modifier la quantité de la ligne correspondante à ma clé composé.

Mais.... ça ne marche pas ^^ je vous mets ci dessous le code :
nPos est un entier = 0
sDéjà est une chaîne = ""


LeTabCompose est un tableau de tableau de chaînes
nIndiceTab est un entier
cleCompo est une chaîne

POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
i++
SI i > 2 ALORS
SI sLigneFichier <> "" ALORS
sRefModule est une chaîne = ExtraitChaîne(sLigneFichier,1,";")
sQuantite est une chaîne = ExtraitChaîne(sLigneFichier,2,";")
sCouleur est une chaîne = ExtraitChaîne(sLigneFichier,3,";")
sFinition est une chaîne = ExtraitChaîne(sLigneFichier,4,";")
sHauteur est une chaîne = ExtraitChaîne(sLigneFichier,5,";")
sLongueur est une chaîne = ExtraitChaîne(sLigneFichier,6,";")

cleCompo = sRefModule +sHauteur +sLongueur +sCouleur +sFinition

//je fais une recherche dans mon tableau pour voir si cet élément figure déjà
Indice est un entier=-1
SI LeTabCompose..Occurrence > 0 ALORS
Indice = TableauCherche(LeTabCompose[1], tcLinéaire,cleCompo)
//Ici je veux afficher la ligne de mon tableau correspondante pour pouvoir faire ;
// Table_Configuration[INDICE_NUM_LIGNE_CHAMP_TABLE].col_quantite = val(Table_Configuration[INDICE_NUM_LIGNE_CHAMP_TABLE].col_quantite)+sQuantite
FIN

SI Indice=-1 ALORS
// j'ajoute le nouvel élément au tableau
// et dans ma table les 4 éléments

nLigne est un entier = TableAjouteLigne(TABLE_Configuration)
TABLE_Configuration[nLigne].COL_RefModule = sRefModule
TABLE_Configuration[nLigne].COL_Quantite = sQuantite
TABLE_Configuration[nLigne].COL_Couleur = sCouleur
TABLE_Configuration[nLigne].COL_Finition = sFinition
TABLE_Configuration[nLigne].COL_Hauteur = sHauteur
TABLE_Configuration[nLigne].COL_Longueur = sLongueur

nIndiceTab = Ajoute(LeTabCompose)
Ajoute(LeTabCompose[nIndiceTab],cleCompo)
Ajoute(LeTabCompose[nIndiceTab],nLigne)
//Mais ici ça marche pas... je ne sais pas vraiment utiliser les tableaux à deux dimensions

//Sinon
// je passe à l'enregistrement suivant
FIN

//Et je boucle
FIN
FIN
FIN


Comment je peux faire pour créer deux colonnes dans mon tableau à deux dimensions ?
Le but étant :

A chaque nouvel ajout d'élément dans mon tableau (car pas encore de doublon) :
J'ajoute une ligne dans ma table :
nLigne = tableajouteligne(table_configuration)

Puis j'ajoute une ligne dans mon tableau :
[1][1] --> Clé composé = sRefModule+sHauteur+sLongueur
[1][2] --> NumLigneTable = nLigne

COMME ça :
A chaque fois qu'on trouve un doublon dans mon tableau d'entiers --> alors je récupère le numéro de ma ligne correspondant à ma clé recherchée dans table_configuration

et je fais :
table_configuration[INDICE_LIGNE_CHAMP_TABLE].col_quantite = val(table_configuration[INDICE_LIGNE_CHAMP_TABLE].col_quantite) + squantite

Mais je n'arrive même pas à affecter le numéro de la ligne dans mon element 2 de mon tableau, ça semble ne pas marcher :
nIndiceTab = Ajoute(LeTabCompose)
Ajoute(LeTabCompose[nIndiceTab],cleCompo)
Ajoute(LeTabCompose[nIndiceTab],nLigne)


merci d'avance...

Fany
Membre enregistré
101 messages
Posté le 04 juin 2015 - 12:09
Bonjour,
Tu compliques beaucoup les choses. Et donc tu obtiens un truc difficile à programmer là où c'était simple.



Pour moi, le plus simple, et peut-être le plus performant, c'est de faire 3 étapes bien indépendantes :
1. lire le fichier CSV, et pour chaque ligne lue, insérer une ligne dans la table.
2. Trier le champ table sur les colonnes Ref , Hauteur, Longueur
3. Parcourir le champ table de la dernière ligne à la première (l'ordre est important), comparer la ligne lue à la suivante, et si ces 2 lignes concernent la même référence, faire les traitements voulus ( recalcul de la quantité, et suppression de la ligne en double).



L'autre option, c'est de faire comme tu as commencé, lire le fichier CSV, et pour chaque ligne lue, regarder si cette ligne doit être ajoutée, ou si on doit modifier une ligne existante.
Mais dans ce cas, il ne faut SURTOUT pas utiliser un tableau qui est la copie plus ou moins exacte du champ table.
Soit tu mets une colonne invisible dans ton champ table, avec dans cette colonne la concaténation de REF+Hauteur+Longueur.
Soit tu crées une fonction tablecherche1() qui ressemblerait à ça :

Procedure tablecherche1(ref0, hau0, long0)
i est un entier
i = TableCherche(matable, ref0)
TANTQUE i > 0
SI matable.haut[i]= haut0 _et_ matable.long[i] = long0 ALORS RENVOYER i
po = TableCherche(matable, ref0, i+1)
FIN
RENVOYER -1

Tu utilises cette fonction au lieu de tablecherche() , et ça te permet de faire une recherche multi-critères.

Et du coup ton code devient tout simple.


Pour TOUTE CHAINE sligne de xxx séparee PAR RC
// initialisation de ref0, haut0, long0
i = tablecherche1(ref0, haut0, long0)
SI i = -1 ALORS
// Ajouter une ligne avec tableajouteligne()
SINON
// modifier la ligne n°i
FIN
FIN



Dernier point :
Il me semble ( à confirmer donc) que de manière générale, on conseille de déclarer les variables au début de la procédure ... puis de les utiliser.
Du coup, quand je vois des variables qui sont déclarées à l'intérieur d'une boucle, ça me fait mal.
Membre enregistré
204 messages
Posté le 04 juin 2015 - 12:35
Bonjour,

Je te suggère de modifier le code précédemment suggéré :

...
//Sinon
// je passe à l'enregistrement suivant
Fin
...

en :

Sinon
// s'il y a doublon, j'ajoute les quantités directement dans la table :
// l'indice trouvé par la recherche correspondant à celui de la table
Table_Configuration[nIndice].col_quantite = Val(Table_Configuration[INDICE_NUM_LIGNE_CHAMP_TABLE].col_quantite) +sQuantite
// je passe à l'enregistrement suivant
Fin

Sauf erreur de ma part
Il me semble qu'il vaut mieux déclarer les variables en dehors des boucles (et il y a un nIndice et un Indice dans ton code).
bon courage
Christophe
Membre enregistré
186 messages
Posté le 04 juin 2015 - 14:44
Pourquoi faire simple quand on peut faire compliqué...
Si on te laisse faire des trucs quand tu reliras ton code dans un an tu te diras que des gros mots :)

//Tu mets ton fichier ou un sélecteur
MonFicest une chaîne = "D:\Classeur1.csv"
ChargementFichierCSVest une chaîne

ChargementFichierCSV=fChargeTexte(MonFic)

sRefModuleest une chaîne
sQuantiteest une entier
sHauteurest un entier
sLongueurest un entier
indLigneest un entier
Ajoutest un booléen

//On parcours le contenu du fichier
POUR TOUT CHAINE sLigneFichier DE ChargementFichierCSV SEPAREE PAR RC
SI SansEspace(sLigneFichier) <> "" ALORS
sRefModule=ExtraitChaîne(sLigneFichier,1,";")
sQuantite=ExtraitChaîne(sLigneFichier,4,";")
sHauteur=ExtraitChaîne(sLigneFichier,2,";")
sLongueur=ExtraitChaîne(sLigneFichier,3,";")
Ajout=Vrai
//On cherche la RefModule
indLigne=TableCherche(COL_Entete,sRefModule, Vrai)
TANTQUE indLigne <> -1
//Si on l'a trouve
SI TABLE_Configuration[indLigne].COL_Hauteur = sHauteur _ET_ TABLE_Configuration[indLigne].COL_Largeur = sLongueur ALORS
//On ajoute la quantité et on met un Flag pour ne pas ajouter l'enregistrement à la table
Ajout=Faux
TABLE_Configuration[indLigne].COL_Quantite+=sQuantite
FIN
//On boucle sur la recherche
indLigne=TableCherche(COL_Entete,sRefModule, Vrai, indLigne +1)
FIN
//Si on a pas trouvé on ajoute la ligne.
SI Ajout ALORS
TableAjouteLigne(TABLE_Configuration,sRefModule,sHauteur, sLongueur, sQuantite)
FIN
FIN
FIN


Ecrit en 5 minutes.
Après si ton fichier est volumineux il vaut mieux effectivement utiliser une colonne cachée qui contient la concaténation RefModule + Hauteur + Longueur pour effectuer les recherche ton code sera plus optimisé.

Bon courage

--
Seb
Posté le 04 juin 2015 - 15:56
Bonjour,

Tu peux faire encore plus simple et plus lisible.

MonFic est une chaîne = "D:\Classeur1.csv"
ChargementFichierCSV est une chaîne

ChargementFichierCSV=fChargeTexte(MonFic)

// Utilisation avec un tableau de structures
STUneCategorie est une structure

Ref est une chaîne
Hauteur est un entier
Largeur est un entier

FIN

tabLesCategories est un tableau de STUneCategorie

// Code de remplissage du tableau
ChaîneVersTableau(ChargementFichierCSV , tabLesCategories, RC ,";")

// Suppression des doublons
TableauSupprimeDoublon(tabLesCategories, ttMembre, "Ref;Hauteur;Largeur")

//code ajout
sValRef est une chaîne
nValHauteur est un entier
nValLargeur est un entier

SI TableauCherche(tabLesCategories,tcLinéaire,"Ref;Hauteur;Largeur",sValRef,nValHauteur,nValLargeur)=-1 ALORS
//Ajout de l'enregistrement

FIN


Bon courage
Guillaume
Posté le 05 juin 2015 - 22:36
Voici ce que j'ai fais pour supprimer les doublons de ma combo

SI ListeOccurrence(COMBO_Annee)>1 ALORS
POUR k =2 _A_ ListeOccurrence(COMBO_Annee)
SI COMBO_Annee[k]=COMBO_Annee[k-1] ALORS
ListeSupprime(COMBO_Annee,k)
FIN
FIN
FIN
Posté le 05 juin 2015 - 23:30
auparavant évidemment tu aura trié la table selon la colonne contenant les doublons :

voici le résultat sur un table

TableTrie(TABLE,"table.COL_LibSerie")
//supprime doublons
SI TableOccurrence(TABLE)>1 ALORS
POUR k = TableOccurrence(TABLE) _A_ 2 PAS -1
SI TABLE.COL_LibSerie[k]=TABLE.COL_LibSerie[k-1] ALORS
TableSupprime(TABLE,k)
FIN
FIN
FIN