Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLBonjour,
La suppression d'éléments d'une liste est bien documentée dans les discussions JSL, mais pour une raison quelconque, je ne parviens pas à comprendre comment procéder :
Je dois supprimer des éléments d'une liste si les éléments CONTIENNENT une chaîne d'une autre liste (pas de correspondance exacte).
Exemple ci-dessous : j'essaie de supprimer tous les éléments qui contiennent « Cal » ou « Blue »
Merci d'avance,
- Prédicateur
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j<=1, j--,
If(contains(ChosenDataCol[j], Eval(RemoveCol[i]))==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);
Analyse et modélisation de données de baseRe: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLDans votre boucle For(),
j<=1
devrait être
j>=1
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j>=1, j--,
If(contains(ChosenDataCol[j], RemoveCol[i])==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLSalut Jim,
Ha oui, j'ai raté ça:)
La solution fonctionne MAIS il semble que le contains() ne soit pas très robuste : si la String à chercher est au milieu de l'élément de la liste, il ne la trouve pas.
Savez-vous pourquoi ?
Le journal du script ci-dessous donne :
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "SiBlue 32"};au lieu de
ChosenDataCol = {"Temp 1", "Temp 25"};
Names Default To Here( 1 );
clear symbols();
Deletesymbols();
ChosenDataCol = {"Si Cal 1", "Ba Cal 2", "toCal 3", "Temp 1", "Temp 25", "Blue 56", "SiBlue 32", "Blue 95"};
RemoveCol = {"Cal", "Blue"};
For (i=1,i<=N Items( RemoveCol ), i++,
For (j=N Items (ChosenDataCol), j>=1, j--,
If(contains(ChosenDataCol[j], Eval(RemoveCol[i]))==1,
Remove from(ChosenDataCol, j)
)
)
);
show (ChosenDataCol);Merci
Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLVeuillez vous référer à ma réponse initiale JSL.
Contains( ChosenDataCol[j], Eval( RemoveCol[i] ) ) == 1
a été changé en
contains(ChosenDataCol[j], RemoveCol[i])==1
qui permet de trouver la bonne réponse. Je ne sais pas pourquoi Eval() interfère avec Contains()
Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLVous pouvez également utiliser Pour chaque ou Filtrer chaque
Names Default To Here(1);
ChosenDataCol = {"Cal1", "Cal2", "Cal3", "Temp1", "Temp25", "Blue56", "Blue32", "Blue95"};
RemoveCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, RemoveCol,
!Contains(val1, val2)
);
N Items(res) == N Items(RemoveCol);
);
// ChosenDataCol = vals; // {"Temp1", "Temp25"}Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLBonjour Jarmo,
Merci au filtre each() qui semble faire l'affaire, même avec des entrées plus complexes (voir ci-dessous).
Idéalement, j'ai besoin des options pour filtrer ChosenDataCol avec les 2 manières :
- Supprimer les éléments indésirables en fonction de la liste de chaînes (cette méthode ici, qui fonctionne maintenant) => RemoveCol
- Conserver uniquement les éléments basés sur une liste de chaînes (l'opposé de la méthode ici)
Je pensais que supprimer le « NOT » de « !Contains() » devrait faire l'affaire, mais cela renvoie une liste vide { }.
Savez-vous pourquoi ?
merci
Supprimer des éléments <-- fonctionne bien
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
RemoveCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, RemoveCol,
!Contains(val1, val2)
);
N Items(res) == N Items(RemoveCol);
);
// log : {"Si Temp1", "bouTemp25"}Garder les éléments <-- ne fonctionne pas
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
Contains(val1, val2)
);
N Items(res) == N Items(KeepCol);
);
// log : {}
Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLVous devrez également prendre en compte ce que fait N Items(res) == N Items(KeepCol);. Vous pouvez ajouter une impression supplémentaire à l'intérieur de la boucle pour vous aider à comprendre cela
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
Contains(val1, val2)
);
show(res);
N Items(res) != N Items(KeepCol);
);
De plus, si vous avez des situations où Cal et Blue peuvent apparaître dans une seule chaîne, vous devrez utiliser une méthode un peu différente.
Re: Supprimer un élément d'une liste contenant des éléments d'une deuxième liste en JSLBonjour Jarmo,
Le " show (res)" m'a aidé à comprendre la logique. Je dois vraiment utiliser davantage les fonctions For Each():)
il manquait un "!" avant Contient pour que le script fonctionne vraiment, mais maintenant mes 2 fonctions fonctionnent correctement.
Je vais devoir réfléchir à ta dernière remarque, je ne suis pas sûr que ce scénario existe !
Merci encore
Prédicateur
Names Default To Here(1);
ChosenDataCol = {"SiCal 1", "Ba Cal 2", "toCal 3", "Si Temp1", "bouTemp25", "CaBlue 56", "SiBlue 32", "Blue 95"};
KeepCol = {"Cal", "Blue"};
vals = Filter Each({val1}, ChosenDataCol,
res = Filter Each({val2}, KeepCol,
!Contains(val1, val2)
);
N Items(res) != N Items(KeepCol);
);
show(vals)
// vals = {"SiCal 1", "Ba Cal 2", "toCal 3", "CaBlue 56", "SiBlue 32", "Blue 95"};