Extraire une chaîne de caractères de longueurs et de positions variablesJe souhaite extraire des chaînes de caractères d'une variable (Dx1), mais la longueur et la position des chaînes varient, mais elles sont séparées par des tirets. Parfois, il y a plusieurs tirets. Par exemple...
"7812-abcdef-9"
"v7892-xyz -0"
"812-fghkj-0"
"17361-gf-jhyt -9"
Ce que je voudrais faire, c'est créer une nouvelle variable qui extrait les chiffres/caractères avant le premier tiret, puis une autre variable qui extrait les caractères entre le premier et le deuxième tiret.Donc,
Var1 Var2
7812 abcdef
v7892 xyz
812 fghkj
17361 gf-jhyt
J'ai essayé de suivre l'exemple publié ici, mais il vient d'extraire le tableau de bord. Changer le +1 en un autre nombre extrait ce nombre de caractères, mais la longueur de mes données varie.
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
Voici ce que j'ai écrit. Qu'est-ce que je fais mal?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Re : Extraire une chaîne de caractères de différentes longueurs et positionsLe Expression régulière() La fonction pourrait être une alternative efficace ici si vous rencontrez des problèmes de stabilité ou de performances (et une boucle while qui devient infinie dans une formule de colonne peut être frustrante à déboguer).
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Re : Extraire une chaîne de caractères de différentes longueurs et positionsMerci encore, Jim.
J'ai utilisé beaucoup plus de lignes que cela. Ce n'était qu'une hypothèse.
Chaque cas de DX1 se termine par un nombre, mais le nombre d'espaces entre ce que j'extrait pour Var2 et ce nombre varie. Peut-être que c'était la cause. Quoi qu'il en soit, votre solution a fonctionné.
Re : Extraire une chaîne de caractères de différentes longueurs et positions65 000 lignes ne représentent pas une très grande table à gérer pour JMP.JMP peut gérer des tables de données comportant des milliards de lignes.Le problème, ce sont les incohérences des données dans votre table de données.Le code suppose qu'au moins un champ numérique sera trouvé après avoir trouvé les valeurs de caractères pour Var2. Apparemment, il existe une situation dans laquelle une valeur de Dx1 ne se termine pas par des nombres.Ce qui suit est un changement de format qui s'adapte à ce problème
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Re : Extraire une chaîne de caractères de différentes longueurs et positionsMerci, Jim. C'est comme ça que je l'ai essayé précédemment. Pour une raison quelconque, JMP Pro 13 semble planter lorsque je l'exécute. Peut-être parce que ma table de données comporte 65 000 lignes ?
Re : Extraire une chaîne de caractères de différentes longueurs et positionsLe code inclus est une formule de colonne.J'ai joint un tableau de données avec la colonne Dx1 que vous avez utilisée dans votre exemple, ainsi que les nouvelles colonnes Var1 et Var2 dont les formules de colonne sont spécifiées.
Re : Extraire une chaîne de caractères de différentes longueurs et positionsMerci, Jim. C'est ce que je cherchais.
Comment exécuter ce script ? Je l'ai essayé comme formule de colonne. Cela n’a pas fonctionné, mais je ne m’y attendais pas. J'ai également ouvert une fenêtre de script et je l'ai exécutée là-bas, mais elle a simplement cessé de répondre.Re : Extraire une chaîne de caractères de différentes longueurs et positionsVoici une formule qui fera ce que vous avez indiqué comme règle....
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Cependant, dans votre exemple ci-dessus, l'exemple « 17361-gf-jhyt -9 » se termine par une valeur Var2 de « gf-jhyt ».Est-ce que c'est ce que tu veux?
Quoi qu'il en soit, j'espère que vous constaterez que vous pouvez construire une formule aussi complexe que nécessaire pour analyser la chaîne quelles que soient les valeurs correctes.La seule limite est que vous devez être capable de déterminer les règles à utiliser.
Re : Extraire une chaîne de caractères de différentes longueurs et positionsLa seule règle à laquelle je puisse penser et qui serait cohérente serait que le deuxième mot apparaisse entre les chiffres (#). En fin de compte, je veux la phrase entre les traits d'union. Donc, "#-mot -#" et "#-mot-mot -#" et "#-mot-mot mot -#"
Re : Extraire une chaîne de caractères de différentes longueurs et positionsJSL permettra la construction et l’analyse de toutes ces conditions complexes.C'est aux humains de déterminer quelles sont les règles d'une telle analyse.
Dans votre exemple, quelle est la règle permettant de déterminer quelles valeurs avec trait d'union doivent être lues comme une valeur combinée et quand les traiter comme des valeurs distinctes ?
Re : Extraire une chaîne de caractères de différentes longueurs et positionsExiste-t-il un moyen pour que WORD ignore certains tirets ? Certains des deuxièmes mots que j'essaie d'extraire sont coupés, je n'obtiens donc qu'une extraction partielle. Par exemple, pour "938-ex-marine", j'obtiens "938" et "ex" plutôt que "ex-marine".
Re : Extraire une chaîne de caractères de différentes longueurs et positionsLe mots la fonction est votre amie ici.Utilisez le tiret et l’espace comme délimiteurs et vous pourrez facilement extraire ce que vous voulez.Voici un exemple qui utilise des formules dans un tableau :
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);Re : Extraire une chaîne de caractères de différentes longueurs et positionsMerci! Cela fonctionne bien.
Re : Extraire une chaîne de caractères de différentes longueurs et positionsVous souhaitez utiliser la fonction Word().Si vous créez une nouvelle colonne, "Var1", et placez la formule ci-dessous dans la colonne, vous obtiendrez les résultats souhaités.
word(1,:Dx1,"-")
Pour Var2, ce serait :
word(2,:Dx1,"-")
La fonction Word() est documentée dans l'index des scripts
Aide==>Index des scripts==>Word
Re : Extraire une chaîne de caractères de différentes longueurs et positions@jswislar :
Une façon de résoudre ce problème pourrait être d'utiliser les fonctions Contains et Substr.
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);