Tronquer les chaînes de caractères<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai plusieurs tables de données qui incluent une colonne appelée "Trouvé dans la version".Les versions majeures comportent généralement 4 chiffres --- les versions mineures ajoutent parfois un caractère alpha à la fin d'un numéro de version majeure.Aux fins de la représentation graphique, je ne souhaite pas afficher les versions mineures --- à la place, je souhaite fusionner les versions mineures avec leurs versions majeures associées.Par exemple...si une version majeure est 5.1.2.1, je veux que la version mineure 5.1.2.1a s'appelle également 5.1.2.1 .....
pour jeter une autre ride dans le mélange ---- je peux aussi vouloir convertir tous les 5.1.2.x en 5.1.2---- donc 5.1.2.0, 5.1.2.2a, 5.1.2.3, 5.1.2.4a , etc... deviendrait la version 5.1.2
La colonne actuelle est 'Caractère', 'Nominal'......Je pensais "tronquer" les chaînes de caractères dans la colonne à 7 caractères ou 5 selon le niveau de détail nécessaire/souhaité --- mais je ne sais pas comment faire cela ou s'il existe une meilleure approche.
De plus --- je reçois des tables de données de différentes équipes --- chacune semble avoir un schéma de version différent --- donc la flexibilité devra être intégrée ----- je ne sais pas si je dois analyser chaque donnée element s, et comparez les caractères communs pour voir s'ils "appartiennent" à la même version ???

Re : Tronquer les chaînes de caractèresLes réponses ici ont été très utiles et m'ont amené à penser que j'avais peut-être rendu cela trop compliqué --- j'ai donc essayé la fonction de caractère 'Gauche' mais je n'ai pas pu la faire fonctionner la semaine dernière ....ma syntaxe devait être 'off' --- car cela a fonctionné pour moi aujourd'hui ..
| Pour chaque ligne ( : Trouvé dans Vers Tronqué = Gauche(:Trouvé dans Version, 7)); |
---- cela tronque simplement la chaîne de caractères vers les caractères les plus à gauche ... ce qui supprimera les caractères de version inférieurs --- puisque les numéros de version de différentes équipes ne sont pas cohérents (certaines équipes utilisent 4 chiffres avec des caractères alpha ajoutés, certains utilisent 3 chiffres sans caractères alpha ajoutés) Je pense que cette méthode peut fonctionner mais je devrai tester quel schéma de version est utilisé pour déterminer le niveau de troncature ....
Re : Tronquer les chaînes de caractèresJe pense qu'une expression régulière (regex()) peut résoudre le problème.
Nouvellecolonne("Trouvé dans la version majeure",caractère,nominal,
formule(regex(:Trouvé dans Version, ".*?(\d+\.\d+\.\d+).*","\1")
);
".*?(\d+\.\d+\.\d+).*" signifie trouver juste assez de n'importe quoi, .*?, suivi d'un nombre de n'importe quelle longueur, \d+, décimal une fois, \., un nombre de longueur quelconque, \d+, décimal une fois, \. , un nombre de longueur quelconque, \d+, suivi de n'importe quoi. Renvoie uniquement la partie entre parenthèses, les nombres et les décimales, \1.
Pour la version mineure, modifiez l'expression régulière (regex()) pour avoir une décimale et un nombre de plus.
Nouvellecolonne("Trouvé dans la version mineure",caractère,nominal,
formule(regex(:Trouvé dans Version, ".*?(\d+\.\d+\.\d+\.\d+).*","\1")
);
Re : Tronquer les chaînes de caractèresPar contre, c'est l'arme nucléaire d'ETL, garantie de tout gérer, mais plus de travail. Vous constaterez peut-être que c'est la seule option si vos différents fournisseurs suivent des processus très différents.
Créez simplement un tableau de conformité unique pour chaque fournisseur :
les données ont ;
longueur FoundInVersion 32 $ ;
entrée FoundInVersion $ ;
cartes;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9étrange
courir;
données master_conversion ;
longueur FoundInVersionGood FoundInVersion $32;
input FoundInVersionGood $ FoundInVersion $;
cartes;
5.1.2 5.1.2.1
5.1.2 5.1.2.2
5.2.2 5.2.2.2a
5.2.2 5.2.2.3
5.2.2 5.2.2.3x
5.2.2 5.2.2.9
5.2.2 5.2.2.9étrange
courir;
proc sql;
créer une table vouloir comme
sélectionnez FoundInVersionGood comme FoundInVersion
de la jointure interne master_conversion
avoir sur (master_conversion.FoundInVersion = avoir.FoundInVersion);
arrêter;
À M
Re : Tronquer les chaînes de caractèresToutes mes excuses pour l'utilisation du code SAS, car je ne suis pas un utilisateur JMP... peut-être que les fonctions équivalentes existent dans JMP ?
C'est très simple et très bête, donc les données doivent être assez conformes :
les données ont ;
longueur FoundInVersion 32 $ ;
entrée FoundInVersion $ ;
cartes;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9étrange
courir;
les données veulent ;
longueur FoundInVersionGood 32 $;
ensemble avoir ;
/* En utilisant le point comme délimiteur, recherchez les premier, deuxième et troisième mots (SCAN), puis concaténez-les avec des points entre (CATX). */
/* suppose qu'il y aura toujours au moins trois niveaux */
FoundInVersionGood = catx(".", scan(FoundInVersion,1,""."), scan(FoundInVersion,2,""."), scan(FoundInVersion,3,""."));
courir;
À M
Re : Tronquer les chaînes de caractèresÇa fera l'affaire.Boucle sur toutes les valeurs et utilise des expressions régulières pour tester chaque valeur.
dt = tableau de données actuel () ;
dt << nouvelle colonne ( "Trouvé dans Vers tronqué" , personnage , nominal ) ;
pour ( je = 1 , je <= nrows ( dt ) , je ++,
test_value = colonne ( dt , "Trouvé dans la version" )[ je ] ;
// Voir si le dernier caractère est l'un de a à z
si ( est manquant ( expression régulière ( test_value , "[az]$" )) ,
// alors
colonne ( dt , "Trouvé dans Vers tronqué" )[ je ] = test_value ;
,
// autre
one_length = longueur ( test_value ) ;
colonne ( dt , "Trouvé dans Vers tronqué" )[ je ] = substr ( test_value , 1 , ( one_length - 1 )) ;
) ;
) ;
Re : Tronquer les chaînes de caractèresSalut,
Je ne sais pas si c'est ce que vous voulez :
les données ont ;
entrée ancienne : 10 $. ;
cartes;
5.1.2
5.1.2.1
5.1.2.1e
;
les données veulent ;
longueur nouveau 5 $ ;
ensemble avoir ;
nouveau=ancien ;
courir;
proc impression;exécuter;
Haïkuo