Bonjour,
Je consulte assez classiquement des données d'une base de données SQL PostGre, et je rencontre quelques petites difficultés avec les formats.
Rien d'insoluble, mais je cherche la solution la plus rapide et la plus automatique pour gérer le problème.
Dans les bases lues, les variables caractère sont de type character varying(255).
Par défaut, lors de la lecture (création d'une table sas par une proc SQL), Sas attribue à ces variables un format $510.
Ce qui est vraiment très gourmand de sa part...
Je cherche donc la méthode la plus efficace possible pour pourvoir travailler ensuite sur ces tables sans difficulté. (plusieurs millions de lignes donc table trop lourde sans ce reformatage).
Ce que j'ai déjà testé :
1. L'idéal serait que SAS reconnaisse automatiquement le caractère varying, y a-t-il une option pour cela ?
2. En attendant, j'ai testé plusieurs choses :
- forcer le format $varying255. lors de la proc sql. Afin de m'épargner l'écriture en extension de la liste des variables, je lis les informations des dictionnaires de la BDD.
C'est inefficace sur la taille finale de la table
- forcer le format réel des variables lors de la proc sql. Cela nécessite premièrement de lire la donnée pour connaître sa longueur maximale réelle, donc lourd...
Une écriture comme suit est également inefficace pour réduire la taille de la table
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 proc SQL noprint ; select max(length(ma_variable)) into: max_length from ma_table; quit ;
3. La proc datasets semble également sans effet (mais je n'ai pas testé ce qui se passe si j'enchaîne une étape datasets ET une étape data réelle pour réécrire l'ensemble des données
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 proc sql; create table ma_table as select ma_variable FORMAT = $3. INFORMAT = $3. from ma_base.ma_table_source ; quit;
4. J'ai finalement opté pour la création d'une nouvelle table
Cette procédure fonctionne et diminue considérablement la volumétrie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 data ma_table_v2; format ma_variable $3.; set ma_table; run;
Quelques questions plus précises :
Q1. Pourquoi l'étape datasets est-elle inefficace ? La réécriture par une étape data me permettrait -elle d'atteindre le mm objectif ?
Q2. Pourquoi le formatage lors de la lecture SQL est-il inefficace ? Aurai-je dû créé premièrement une table vide en SAS avec les bons formats ?
Q3. Quelle est la meilleure façon de calculer la longueur maximum réelle des variables concernées ?
Merci par avance pour vos éclaircissements
Partager