Combiner deux cordesSalut,
J'ai 2 colonnes qui contiennent des chaînes au format suivant :
chaîne1 = 1.11;0;3;0;5
chaîne2 = 0;2.2;0;4;0
Remarque 1 : les deux chaînes contiennent le même nombre de ";" (mais ils n'ont pas forcément la même longueur).
Remarque 2 : les deux chaînes ont des 0 dans des positions alternées.
Je souhaite créer une nouvelle colonne (string3) qui résulte de la fusion des deux colonnes sans les 0. Pour l'exemple ci-dessus : 1.11;2.2;3;4;5
Donc la chaîne3 devrait avoir le même nombre de ";" comme chaîne1 et chaîne2, et doit contenir tous les termes entre le ";" par commande, sans 0.
Existe-t-il un moyen de le faire en utilisant uniquement des formules (sans script jsl) ?
Sinon, existe-t-il un moyen de le faire avec jsl?
Voir pièce jointe.
Merci,
Yotam
Tableau de donnéesScriptRe: Combiner deux cordesVoici une formule qui fonctionnera.J'ai joint une nouvelle table de données avec une nouvelle colonne de formules
w = 1;
newString = "";
While( Word( w, :string1, ";" ) != "",
If( newString != "",
newString = newString || ","
);
If( Word( w, :string1, ";" ) != "0",
newString = newString || Word( w, :string1, ";" ),
newString = newString || Word( w, :string2, ";" )
);
w++;
);
newString;
Re: Combiner deux cordes@DonMcCormack - Je pense que cela pourrait être un grand problème de défi.
- comment détecter et gérer les erreurs dans les chaînes (non-nombres, zéros incompatibles, pas de même longueur)
- comment le rendre rapide pour les points-virgules 1E6
edit : Utilisation du JMP 16 Pour chacun à travers boucle:
string1 = "1;0;2;0;0;8;0";
string2 = "0;1;0;3;5;0;13";
result = "";
For Each( {{w1, w2}, idx}, across( Words( string1, ";" ), Words( string2, ";" ) ),
result ||= (If( idx > 1, ",", "" ) || If( w1 == "0", w2, w1 ))
);
result;"1,1,2,3,5,8,13"
Re: Combiner deux cordesFantastique.
Merci!
Re : Combiner deux cordesMerci!
Malheureusement, je n'ai pas encore JMP16, mais cette solution a l'air très élégante !
Re : Combiner deux cordesPendant que @txnelson et @Craige_Hales vous a donné des options intéressantes et utiles, si j'ai bien compris votre situation, cela peut être fait dans une formule sans boucles.
Voici la formule avec laquelle je me suis retrouvé, d'abord sous forme d'image, puis en JSL (qui peut être collé dans l'éditeur de formule).

If( !Is Missing( :string1 ) & !Is Missing( :string1 ),
string1list = Words( :string1, ";" );
string2list = Words( :string2, ";" );
Concat Items( string1list[Loc( string1list, "0" )] = string2list[Loc( string1list, "0" )], ";" );
,
""
)
Cela utilise le Mots() fonction pour convertir vos chaînes en listes. Il utilise le Loc() pour renvoyer une matrice d'emplacements des 0 dans string1 et l'utilise comme index pour string1list (sur le côté gauche d'une affectation) et string2list (sur le côté droit de cette affectation). Finalement, le Concat éléments() La fonction reconvertit la liste en une chaîne délimitée par des points-virgules.
Si tout cela prête à confusion ou n'a pas de sens, faites-le moi savoir et je vous expliquerai davantage.