-1
votes

SAS MACRO: Comment trier une séquence de "," des nombres séparés à l'aide de la macro SAS sans utiliser de procégres?

Voici des valeurs séparées par des virgules comme suit:

%macro sorts (values=);
%let val = %sysfunc(countw(&values.,','));
%do i=1 %to &val.;
    %let str1= %scan(&values.,&i.,',');
        %do j=&i.+1 %to &val.;
             %let seq = %bquote( );
             
            %let str2= %scan(&values.,&j.,',');
            %if &str1. < &str2. %then %do;
                %let tmp = &str1.;
                %let str1 = &str2.;
                %let str2 = &tmp.;
                %let seq = &str1.;
         %end;
         %put &str1.;
  %end;
%end;

%mend sorts;

%sorts(values=%str(15,30,16,8,86,98,6));

sas

2 commentaires

Pourquoi les limitations d'aucune étape de données et doivent être macro? S'expliquer comme ça est inefficace. Vous n'avez pas comptabilisé des liens cependant, c'est un problème pour les démarreurs.


Publiez la logique que vous pensez que vous utilisez pour trier ici ou vos commentaires sur ce que vous pensez que le code fait ici. Je passe du temps difficile à suivre votre logique.


3 Réponses :


2
votes

J'ai simplifié votre logique.

  1. Déterminez d'abord le nombre d'éléments de votre liste et attribuez-le à une variable macro
  2. Utilisez la fonction la plus petite () pour obtenir la nième plus petite valeur itérative. Utilisez un% de boucle à itérer.

    Cela traite correctement les liens correctement. xxx

    juste une suggestion, lors de la gestion du code comme celui-ci, générez d'abord le pseudo-code ou votre logique, puis Créez le code. La logique utilisée ici est similaire à ce que vous apprendriez dans un cours de programmation de première année de la manière de travailler et ne devrait vraiment jamais être utilisé dans le code actuel. Ceci est uniquement utile en tant qu'exercice de programmation.


0 commentaires

3
votes

Envelopper la fonction de données String String Littéral Fonction Arguments dans % STR () code> au lieu de '' code> xxx pre>

devrait être P>

575  %put %sortn(values=%str(15,30,16,8,86,98,6,1));
1,6,8,15,16,30,86,98


0 commentaires

2
votes

Il est assez facile de faire dans une étape de données. Fonctionne mieux si vous connaissez le nombre d'éléments de la liste. Exemple: xxx pré>

afin de convertir ceci en macro profite simplement de l'option SYSPARM et de la fonction Dosuch (). P>

174   %put %sort(15, 30, 16, 8, 86, 98, 6, 6, 100, -9);
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


-9,6,6,8,15,16,30,86,98,100
175   %put %sort(5 6 3 10);
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds


3,5,6,10


0 commentaires