Analyser la chaîne d'une colonne et remplir une autre colonneSalut,
J'ai une table contenant ProductName et je souhaite générer la colonne OUTPUT.La colonne OUTPUT est une concaténation de ProductID avec Serial#. Comment analyser avec précision le numéro de série et créer la colonne OUTPUT ?
Exemples de numéros de série :
- 07-08_13 signifie numéro de série 07, 08, 13
- 09-12 signifie numéro de série 09, 10, 11, 12
- 01-03_05-08 signifie numéro de série 01, 02, 03, 05, 06, 07, 08
- 01_04_05-08 signifie numéro de série 01, 04, 05, 06, 07, 08
- 09_11_13_14 signifie numéro de série 09,11,13,14

| Nom du produit | SORTIR |
| AABBCC_07-08_13 | AABBCC-07 |
| AABBCC_07-08_13 | AABBCC-08 |
| AABBCC_07-08_13 | AABBCC-13 |
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
| EEFFGG_02 | EEFFGG-02 |
| HHIIJJ_01-07 | HHIIJJ-01 |
| HHIIJJ_01-07 | HHIIJJ-02 |
| HHIIJJ_01-07 | HHIIJJ-03 |
| HHIIJJ_01-07 | HHIIJJ-04 |
| HHIIJJ_01-07 | HHIIJJ-05 |
| HHIIJJ_01-07 | HHIIJJ-06 |
| HHIIJJ_01-07 | HHIIJJ-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-01 |
| KKLLLMM_01-03_05-08 | KKLLLMM-02 |
| KKLLLMM_01-03_05-08 | KKLLLMM-03 |
| KKLLLMM_01-03_05-08 | KKLLLMM-05 |
| KKLLLMM_01-03_05-08 | KKLLLMM-06 |
| KKLLLMM_01-03_05-08 | KKLLLMM-07 |
| KKLLLMM_01-03_05-08 | KKLLLMM-08 |
| NNOOPP_01_04_05-08 | NNOOPP-01 |
| NNOOPP_01_04_05-08 | NNOOPP-04 |
| NNOOPP_01_04_05-08 | NNOOPP-05 |
| NNOOPP_01_04_05-08 | NNOOPP-06 |
| NNOOPP_01_04_05-08 | NNOOPP-07 |
| NNOOPP_01_04_05-08 | NNOOPP-08 |
| QQRRSS_09_11_13_14 | QQRRSS_09 |
| QQRRSS_09_11_13_14 | QQRRSS_11 |
| QQRRSS_09_11_13_14 | QQRRSS_13 |
| QQRRSS_09_11_13_14 | QQRRSS_14 |
Modélisation statistique avancéePersonnalisation de masseRe : Analyser la chaîne d'une colonne et remplir une autre colonneOui, vous pouvez, mais vous devrez déterminer quand ajouter de nouvelles lignes, etc.Ce que je suggère, c'est d'exécuter le code tel quel, puis d'utiliser
Tables=>Rejoindre
pour rassembler les 2 tableaux de données.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut Jim,
Peut-on faire en sorte qu'il n'y ait pas de dt2 ? Pouvez-vous ajouter les colonnes ProductID et Output dans dt ?
Merci!
Re : Analyser la chaîne d'une colonne et remplir une autre colonneÉtant donné que les données sont saisies manuellement, cela ne gérera probablement pas tous les cas particuliers, mais semble fonctionner pour les valeurs actuelles :
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "N4TA47_13-14-15-16-17-18", "N4TA59_13-19", "N4PX74-01-06"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
newVals = Associative Array();
For Each({prodname_str}, uniqProd,
prodPart = Word(1, prodname_str, "_-");
serialPart = Substr(prodname_str, Length(prodPart) + 2);
//find and remove next range from serialPart
newVals[prodname_str] = {};
While(Length(serialPart) > 0 & serialPart != "_" & serialPart != "-",
nextRange = Regex(serialPart, "\d*-\d*");
If(IsMissing(nextRange),
break();
);
serialPart = Substitute(serialPart, nextRange, "");
If(Contains({"-", "_" }, Substr(serialPart, 1, 1)),
serialPart = Substr(serialPart, 2); //remove -_ if first character
);
nextRange = Words(nextRange, "-");
rangeVals = Index(Num(nextRange[1]), Num(nextRange[2]));
For Each({val}, rangeVals,
val = char(val);
val = Substr("00", Length(val) + 1) || val;
Insert Into(newVals[prodname_str], prodPart||"-"||val);
);
);
singleVals = Transform Each({val}, Words(serialPart, "_"),
val = char(val);
val = Substr("00", Length(val) + 1) || val;
prodPart||"-"||val;
);
Insert Into(newVals[prodname_str], singleVals);
);
vals = {{}, {}};
For Each({{key, value}}, newVals,
productname_list = Repeat({key}, N Items(value));
Insert Into(vals[1], productname_list);
Insert Into(vals[2], Sort List(value));
);
//add values to new table
dt = New Table("Productname",
New Column("ProductName", Character, "Nominal", Set Values({})),
New Column("OUTPUT", Character, "Nominal", Set Values({}))
);
dt:ProductName << Set Values(vals[1]);
dt:OUTPUT << Set Values(vals[2]);
Re : Analyser la chaîne d'une colonne et remplir une autre colonneIl y avait juste une erreur mineure où un -1 n'était pas supprimé lorsque j'ai restructuré mon code.

Names Default To Here( 1 );
dt = Current Data Table();
dt2 = New Table( "The Output",
New Column( "Product Name", character ),
New Column( "ProductID", Character ),
New Column( "OUTPUT", Character )
);
For( dtRow = 1, dtRow <= N Rows( dt ), dtRow++,
If( dtRow == 1 | dt:ProductName[dtRow - 1] != dt:ProductName[dtRow],
prodID = Word( 1, dt:ProductName[dtRow], "_" );
remainder = Substr( dt:ProductName[dtRow], Length( prodID ) + 2 );
While( Word( 1, remainder, "_" ) != "",
theWord = Word( 1, remainder, "_" );
If( Contains( theWord, "-" ),
numDigets = Length( Word( 1, theWord, "-" ) ) - 1;
zeros = Repeat( "0", numDigets );
For( loop = Num( Word( 1, theWord, "-" ) ),
loop <= Num( Word( 2, theWord, "-" ) ), loop++,
dt2 << Add rows( 1 );
theRow = N Rows( dt2 );
dt2:ProductName[theRow] = dt:ProductName[dtRow];
dt2:ProductID[theRow] = Word( 1, dt:ProductName[dtRow], "_-" );
dt2:output[theRow] = dt2:ProductID[theRow] || "-" ||
Substr( zeros, Length( Char( loop ) ) ) || Char( loop );
);
,
dt2 << Add Rows( 1 );
theRow = N Rows( dt2 );
dt2:output[theRow] = prodID || "-" || Word( 1, theWord, "-" );
dt2:ProductName[theRow] = dt:ProductName[dtRow];
dt2:ProductID[theRow] = Word( 1, dt:ProductName[dtRow], "_-" );
);
remainder = Substr( remainder, Length( theWord ) + 2 );
);
)
);
Assurez-vous de prendre le temps d’étudier le code afin de bien comprendre son fonctionnement.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneMerci Jim mais la SORTIE semble être incorrecte. Par exemple les 3 premières lignes, la SORTIE doit être :
AABBCC-07
AABBCC-08
AABBCC-13
Re : Analyser la chaîne d'une colonne et remplir une autre colonneLes données ProductName sont saisies manuellement. Ce sont des exceptions et s’amélioreront avec le temps. Veuillez les ignorer.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneVoici un script qui produit un nouveau tableau qui développe les lignes comme demandé.En plaçant les données dans une nouvelle table, cela évite le problème du nombre insuffisant de lignes pour l'expansion.Il semble gérer tous les modèles connus.

Names Default To Here( 1 );
dt = Current Data Table();
dt2 = New Table( "The Output",
New Column( "Product Name", character ),
New Column( "ProductID", Character ),
New Column( "OUTPUT", Character )
);
For( dtRow = 1, dtRow <= N Rows( dt ), dtRow++,
If( dtRow == 1 | dt:ProductName[dtRow - 1] != dt:ProductName[dtRow],
prodID = Word( 1, dt:ProductName[dtRow], "_" );
remainder = Substr( dt:ProductName[dtRow], Length( prodID ) + 2 );
While( Word( 1, remainder, "_" ) != "",
theWord = Word( 1, remainder, "_" );
If( Contains( theWord, "-" ),
numDigets = Length( Word( 1, theWord, "-" ) ) - 1;
zeros = Repeat( "0", numDigets );
For( loop = Num( Word( 1, theWord, "-" ) ) + 1,
loop <= Num( Word( 2, theWord, "-" ) ), loop++,
dt2 << Add rows( 1 );
theRow = N Rows( dt2 );
dt2:ProductName[theRow] = dt:ProductName[dtRow];
dt2:ProductID[theRow] = Word( 1, dt:ProductName[dtRow], "_-" );
dt2:output[theRow] = dt2:ProductID[theRow] || "-" ||
Substr( zeros, Length( Char( loop ) ) ) || Char( loop );
);
,
dt2 << Add Rows( 1 );
theRow = N Rows( dt2 );
dt2:output[theRow] = prodID || "-" || Word( 1, theWord, "-" );
dt2:ProductName[theRow] = dt:ProductName[dtRow];
dt2:ProductID[theRow] = Word( 1, dt:ProductName[dtRow], "_-" );
);
remainder = Substr( remainder, Length( theWord ) + 2 );
);
)
);Re : Analyser la chaîne d'une colonne et remplir une autre colonneVérifiez rapidement qu'il existe trois problèmes différents :
1. Briser la « règle » selon laquelle il y a toujours le même nombre de noms de produits que les numéros de série. N4TA59_13-19 dans les données une seule fois, devrait être 7 fois
2. La pièce du numéro de série ne commence pas par _ (N4PX74 - 01-06)
3. Plage ne commençant pas par _ (N4TA47_13-14-15-16-17-18) ou il ne doit s'agir que de valeurs uniques
Tout cela nécessitera des correctifs différents. S'agit-il de problèmes de qualité de données ou le script devrait-il être capable de gérer tous ces problèmes ?
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut Jthi,
Votre script ne fonctionnera pas si mon ProductName est un mélange de caractères et de chiffres. J'ai joint un tableau. Voici à quoi ressemblera la plupart de mon nom de produit. Merci de m'avoir aidé.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSi tel est le cas, il devrait déjà être capable de le gérer. J'ai fait de petites modifications (création de colonne OUTPUT si elle manque). Actuellement, cela repose sur le fait que la table de données est triée par ProductNames, ce qui pourrait causer des problèmes à un moment donné, ou alors vous pouvez vous assurer que la table d'entrée est triée (solution la plus simple).
Vous devriez pouvoir utiliser la partie For Each qui peut même être utilisée sans datatable tant que vous avez une variable de liste nommée uniqProd qui a ProductNames. Après cela, il suffit de comprendre comment ajouter des valeurs au datatable.
Names Default To Here(1);
//Test table
/*
dt = New Table("Untitled 4993",
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
)
);
*/
dt = Current Data Table();
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd, //loop for each ProductName
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges, //Loop for serialnumber inside the ProductName
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
//if starting table doesn't have OUTPUT column create it
If(!Contains(dt << Get Column Names("String"), "OUTPUT"),
dt << New Column("OUTPUT", Character, "Nominal");
);
//dt[0,"OUTPUT"] = valList; subscripting, maybe a bit more difficult to understand
dt:OUTPUT << Set Values(valList);
Version simplifiée de ce que le script essaie de faire :
1. Le script obtient toutes les valeurs uniques dans la colonne ProductName
2. Le script boucle sur chacun d'eux en deux parties For Each boucle
3. La première boucle boucle sur les valeurs uniques et les divise en parties produit et numéro.
4. La partie Serialnumber est ensuite à nouveau bouclée pour la diviser en valeurs uniques. Ces valeurs uniques sont concaténées avec la partie Product, puis la chaîne est insérée dans la liste valList (ce 4. n'est pas exactement aussi simple que je l'ai expliqué ici).
5. Une fois les deux boucles terminées, vous devriez avoir une liste contenant tous les numéros de série possibles. Les parties du produit seront classées par ordre alphabétique.
6. Cette liste est ensuite ajoutée à OUTPUT si elle existe, si ce n'est pas le cas, elle est d'abord créée.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut Jthi,
Oui, le nombre de lignes correspondait au nombre de numéros de série.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneCela devrait être assez facile. Avez-vous autant de lignes dans les données extraites que de numéros de série ?
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut Jthi,
Merci pour le script mais ma table est en fait dynamique. Chaque jour, j'extraireai ce tableau d'une base de données avec une plage de dates différente et différents ensembles de ProductName apparaîtront. Il ne s'agit donc pas toujours de 32 lignes. Votre script peut presque fonctionner, mais pouvez-vous gérer la taille du tableau ? Merci.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut chris,
J'ai un script qui traitera une partie du ProductName et qui sera parfois mal analysé. Pouvez-vous examiner et ajouter des codes pour traiter les noms de produit qui ne fonctionnent pas jusqu'à présent ?
Fonctionnera pour les exemples ci-dessous :
EEFFGG_02
HHIIJJ_01-07
KKLLLMM_01-03_05-08
Ne fonctionnera pas encore pour les exemples ci-dessous :
AABBCC_07-08_13
NNOOPP_01_04_05-08
QQRRSS_09_11_13_14
dt=current data table();
(dt << New Column( "ProductID", Character )) << Set Selected;
(dt << New Column( "OUTPUT", Character )) << Set Selected;
//Parse string in ProductName column
For Each Row(
dt,
//Assign the ProductID value
:ProductID = Word( 1, :ProductName, "_-" ); //"_"
//If the ProductName changes, capture the start and end
If( :ProductName != Lag( :ProductName, 1 ),
start = Num( Word( 2, :ProductName, "_-" ) );
end = Num( Word( 3, :ProductName, "_-" ) );
);
//Assign the OUTPUT value
:OUTPUT = :ProductID || "-" || Repeat( "0", 2 - Length( Char( start ) ) ) || Char( start );
//After end value & there is an _, set start to value after _
If( start == end & Contains( :ProductName, "_"),
start = Num( Word(-2, :ProductName, "_-" ) ),
start++);
);
Re : Analyser la chaîne d'une colonne et remplir une autre colonneOk, ça pourrait marcher. Nécessite JMP16 en raison de l'utilisation de For Each (peut être remplacé par For pour d'autres versions. Il s'agit d'une solution fortement scriptée, avec peu ou pas de commentaires et nécessitera une table de départ spécifique pour fonctionner (nécessite la colonne OUTPUT).
Names Default To Here(1);
dt = New Table("Untitled 4993",
Add Rows(32),
Compress File When Saved(1),
New Column("ProductName",
Character,
"Nominal",
Set Values(
{"AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_07-08_13", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "AABBCC_09-12", "EEFFGG_02",
"HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "HHIIJJ_01-07", "KKLLLMM_01-03_05-08",
"KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08", "KKLLLMM_01-03_05-08",
"NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08", "NNOOPP_01_04_05-08",
"QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14", "QQRRSS_09_11_13_14"}
)
),
New Column("OUTPUT",
Character(16),
"Nominal",
Set Values({"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""})
)
);
Summarize(dt, uniqProd = by(:ProductName));
valList = {};
For Each({prod}, uniqProd,
prodPart = Word(1, prod, "_");
serialPart = Substr(prod, Contains(prod, "_") + 1); //remove start
possibleRanges = Words(serialPart, "_"); //if they contain -
For Each({val}, possibleRanges,
If(Contains(val, "-"), //range
rangeVals = Words(val, "-");
For Each({val1}, Index(Num(rangeVals[1]), Num(rangeVals[2])),
valToAdd = Substr("0", Length(Char(val1))) || Char(val1);
Insert Into(valList, prodPart || "-" || valToAdd)
);
,
Insert Into(valList, prodPart || "-" || Substr("0", Length(Char(val))) || Char(val))
)
);
);
dt[0,"OUTPUT"] = valList;Vous vous demandez si quelque chose comme ça pourrait être fait "facilement" avec la propre correspondance de modèles de JMP @Craige_Hales
Re : Analyser la chaîne d'une colonne et remplir une autre colonneMerci mais je préfère un jsl plutôt que le délimiteur interactif. Votre méthode n'a pas résolu le scénario dans lequel le numéro de série 09-12. Il devrait afficher des lignes comme ci-dessous. Pas seulement AABBCC-09 et AABBCC-12. Le "-" signifie "à" signifiant plage. Donc 09-12 signifie 09, 10, 11, 12.
| AABBCC_09-12 | AABBCC-09 |
| AABBCC_09-12 | AABBCC-10 |
| AABBCC_09-12 | AABBCC-11 |
| AABBCC_09-12 | AABBCC-12 |
Re : Analyser la chaîne d'une colonne et remplir une autre colonneOh, tu as raison. le - est interprété comme une plage et le _ est interprété comme un véritable délimiteur d'éléments
Re : Analyser la chaîne d'une colonne et remplir une autre colonne@jthi ,
Vous m'avez devancé.
Votre explication est plus détaillée et ce à quoi je pensais aussi.
Re : Analyser la chaîne d'une colonne et remplir une autre colonneSalut @cchueng ,
Il existe plusieurs façons. Certains sont basés sur des scripts (recherchez une réponse de quelqu'un qui suggère cela avec un exemple) ou vous pouvez utiliser des séries successives de texte en colonnes (exemple trouvé ici Résolu : Comment puis-je diviser le texte d'une colonne en plusieurs colonnes ? - Communauté d'utilisateurs JMP) Ensuite, vous pouvez concaténer les colonnes souhaitées en les sélectionnant, puis utiliser une formule de colonne ou utiliser l'option Nouvelle colonne de formule après un clic droit sur l'une des colonnes sélectionnées. Recherchez les options de caractère pour concat.La formule des colonnes est plus flexible et vous offre de nombreuses options voir l'aide sur ce sujet ( Créer des formules dans JMP )
J'espère que cela vous donne une direction.
Meilleur,
Re : Analyser la chaîne d'une colonne et remplir une autre colonneTrès probablement, vous pourriez écrire une formule avec Lag pour ce faire (ou un script avec JSL), mais vous pouvez également essayer de le faire de manière interactive, mais cela prend plusieurs étapes :
1. Sélectionnez la colonne ProductName
2. Accédez aux colonnes Cols/Utilities/Text To et utilisez les deux - et _ comme délimiteurs.

3. Accédez à Tables et Pile et ajoutez tout le reste à l'exception de la première colonne à la sélection des colonnes de pile.


5. Supprimer la colonne Étiquette
6. Sélectionnez les deux colonnes restantes et accédez à Lignes / Sélection de lignes / Sélectionnez les lignes en double et supprimez ces lignes.

7. Sélectionnez une cellule avec une valeur vide, choisissez Sélectionner les cellules correspondantes et supprimez ces lignes.
8. Choisissez maintenant les deux colonnes et faites un clic droit sur l'en-tête de la colonne et créez une formule

9. Ouvrez la formule que vous venez de créer et remplacez le , par _

10. Renommer et supprimer des colonnes/formules
11. Si vous avez besoin d'avoir ProductName là-bas, vous devriez pouvoir le conserver si vous ne le supprimez pas accidentellement lors de la première étape comme je l'ai fait

Si vous devez avoir - ou _ selon le numéro de série, vous pourriez probablement le gérer dans la formule de concaténation
Edit : j'ai vérifié la question un peu plus précisément et c'est un peu plus compliqué que ce que j'ai montré ici. Vous devrez ajouter des calculs pour certains numéros de série car ils se trouvent entre des nombres. Cette solution ne fonctionnera pas dans ceux-ci car certaines lignes seront supprimées lorsque les doublons seront supprimés.