Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > ODS et reporting
ODS et reporting Forum d'entraide sur les fonctionnalités de reporting de SAS : gérer les sorties et graphiques de SAS
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2010, 19h32   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 1
Points : 1
Par défaut DATA _NULL_ split avec espace après retour à la ligne

Bonjour,

je veux transférer le contenu d'un champ vers un fichier texte,
ce champ est une longue variable caractère de longueur $2000 du type :
(year=2001 and month=01 and day=01) or (year=2001 and month=01 and day=02) ...... jusqu'a 31 fois pour les mois de 31 jours,

quand je cree un fichier txt à partir de ce champ, les lignes sont limités à 262, et donc les retours à la ligne sont fait un peu n'importe comment: au milieu d'un YEAR ou un OR et donc je me retrouve avec un YE AR ou O R (j'ai pas essayé avec un lrecl mais ça pas ça le problème: je veux pas me retrouver avec des lignes très allongées),

qu'est ce qu'on peut me conseiller pour avoir un retour intelligent à la ligne, si ça se peut se faire sous une proc je prends aussi

Merci d'avance

un petit code pour comprendre: dans mon cas retour à la ligne en milieu d'un MONTH

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
DATA test;
do i=1 TO 31;
var="(year=2001 and month=01 and day="!!compress(i)!!")";
output;
end;
 
proc sql;
SELECT var INTO :groupe  separated BY ' or ' FROM test;
quit;
 
DATA test1;
char="&groupe";
run;
 
DATA _null_;
file <chemin> /*lrecl=3000*/;
SET test1;
put char;
run;
compo76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 10h06   #2
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
J'ai un souci avec ton problème, c'est que quand je le teste chez moi, je n'ai pas de problème !

D'une part, la log indique bien que tout est exporté sur une seule ligne :
Code :
1
2
3
4
5
6
7
8
9
 
NOTE: The file "c:\temp\test.txt" IS:
      File Name=c:\temp\test.txt,
      RECFM=V,LRECL=3000
 
NOTE: 1 record was written TO the file "c:\temp\test.txt".
      The minimum record length was 1196.
      The maximum record length was 1196.
NOTE: There were 1 observations READ FROM the DATA SET WORK.TEST1.
--> As tu le même type de résultat dans la log ?

D'autre part, quand j'ouvre le fichier, tout est bien sur une ligne.
Le problème vient peut être de l'application avec laquelle tu ouvres le fichier txt ?
Moi je l'ouvre avec le "bloc note" de Windows
--> Avec quelle application ouvres tu ton fichier txt ?
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/11/2010, 11h21   #3
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Voilà quand même une piste de solution

Cela consiste à redécomposer char en 31 variables char_1 à char_31,
et à les exporter l'une après l'autre.

Pour cela, on part du principe que la variable char a une structure vraiment figée : les longueurs des champs sont toujours les mêmes. Avec le fait que la longueur augmente de +1 quand l'on passe du 9ième au 10ième jour.

L'étape data est sûrement optimisable, j'ai rajouté une ou deux rustines pour gérer des anos (notamment loop=32)
J'ai aussi géré le cas des mois de moins de 31 jours.
POur le test, j'ai fait un putlog pour visualiser les résultats dans la log : il te suffit normalement de remettre le put classique et le file.

Le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DATA _null_ ;
    SET test1 ;  
    array char_n{31} $39  char_1-char_31 ;
 
        char_n(1) = substr (char, 1, 35) ;
 
    do loop = 2 TO 9 ;
        char_n(loop) = substr (char, 35     + (loop-2) * 38 , 38) ;
        end; 
 
    do loop = 10 TO 31 ;
        IF 28 + (loop-2) * 39 < length(char) 
        then 
        char_n(loop) = substr (char, min (28 + (loop-2) * 39, length(char)-38) , 39) ;
        end; 
 
    do loop = 1 TO 31 ;
        IF NOT missing(char_n(loop)) then putlog char_n(loop) ;
    end ; 
run ;
Le résultat obtenu dans la log :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(year=2001 AND month=01 AND day=1)
OR (year=2001 AND month=01 AND day=2)
OR (year=2001 AND month=01 AND day=3)
OR (year=2001 AND month=01 AND day=4)
OR (year=2001 AND month=01 AND day=5)
OR (year=2001 AND month=01 AND day=6)
OR (year=2001 AND month=01 AND day=7)
OR (year=2001 AND month=01 AND day=8)
OR (year=2001 AND month=01 AND day=9)
OR (year=2001 AND month=01 AND day=10)
OR (year=2001 AND month=01 AND day=11)
OR (year=2001 AND month=01 AND day=12)
OR (year=2001 AND month=01 AND day=13)
OR (year=2001 AND month=01 AND day=14)
OR (year=2001 AND month=01 AND day=15)
OR (year=2001 AND month=01 AND day=16)
OR (year=2001 AND month=01 AND day=17)
OR (year=2001 AND month=01 AND day=18)
OR (year=2001 AND month=01 AND day=19)
OR (year=2001 AND month=01 AND day=20)
OR (year=2001 AND month=01 AND day=21)
OR (year=2001 AND month=01 AND day=22)
OR (year=2001 AND month=01 AND day=23)
OR (year=2001 AND month=01 AND day=24)
OR (year=2001 AND month=01 AND day=25)
OR (year=2001 AND month=01 AND day=26)
OR (year=2001 AND month=01 AND day=27)
OR (year=2001 AND month=01 AND day=28)
OR (year=2001 AND month=01 AND day=29)
OR (year=2001 AND month=01 AND day=30)
OR (year=2001 AND month=01 AND day=31)
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 11h36   #4
Invité de passage
 
Inscription : novembre 2010
Messages : 7
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 7
Points : 1
Points : 1
j'ai exactement le même message sur la log, y'a donc un lien avec l'application avec laquelle j'ouvre le fichier:

bloc notes de windows (vista) => affichage sur 2 ligne avec un mot splitté et un espace introduit avec le retour à la ligne.
notepad++ et similaires : affichage sur 1 ligne.
wordpad : des lignes raccourcies ( 70/74 caracteres) ! donc plusieurs lignes et une bonne gestion des retours à la ligne ( pas de split ...).

merci pour le code, on évite ce problème de lignes allongées et c'est plus présentable.
compo76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h36.


 
 
 
 
Partenaires

Hébergement Web