1: /* $Id: rleda.c,v 1.4 2005/02/14 12:15:06 brouard Exp $
2: $State: Exp $
3: $Log: rleda.c,v $
4: Revision 1.4 2005/02/14 12:15:06 brouard
5: Garde une variable intitulée numero qui relit les niveaux 2 et 3, tant
6: en SAS qu'en STATA.
7:
8: Revision 1.3 2005/02/08 17:10:08 brouard
9: Lit le fichier index deux fois pour n'avoir qu'un passage en SAS.
10: AJoute le proc contents des fichiers créés en fin de run;
11:
12: Revision 1.2 2003/12/12 19:08:17 brouard
13: Les variables ne sont plus toutes écrites en ligne mais avec un retour
14: à la ligne toutes les 5 variables.
15:
16: Revision 1.1.1.1 2003/12/12 18:53:44 brouard
17: Import de rleda
18:
19:
20: rleda.c
21: Programme pour lire une fichier d'index de LEDA qui a t converti de l'EBCDIC vers l'ascii
22: Nicolas Brouard (Institut national d'tudes d mographiques)
23: Usage : rleda nom_d_index
24: Il y a plusieurs sorties, un log (pour le debug) un .txt pour le format et
25: un .sas pour le sas.
26: Je me suis inspir de la version sas d'Andr Wielki (INED).
27: Mardi 25 novembre 2003
28: */
29: #include <stdio.h>
30: #include <string.h>
31: #include <unistd.h>
32:
33: #define MAXLINE 300
34: #define FILENAMELENGTH 300
35: #define FILENAMEEXTLEN 10
36: #define GLOCK_ERROR_NOPATH -1 /* empty path */
37: #define GLOCK_ERROR_GETCWD -2 /* cannot get cwd */
38:
39: #ifdef unix
40: #define DIRSEPARATOR '/'
41: #define ODIRSEPARATOR '\\'
42: #else
43: #define DIRSEPARATOR '\\'
44: #define ODIRSEPARATOR '/'
45: #endif
46:
47: char version[]="rleda-0.9.5 Programme de lecture de fichiers d'index au format LEDA convertis de l'EBCDIC en ASCII ";
48: char fullversion[]="$Revision: 1.4 $ $Date: 2005/02/14 12:15:06 $";
49: char line[MAXLINE];
50: char title[MAXLINE],namevar[MAXLINE], namevara[MAXLINE];
51:
52: char fileres[FILENAMELENGTH], filereso[FILENAMELENGTH];
53: char filesas[FILENAMELENGTH]; /* SAS file */
54: char filestata[FILENAMELENGTH]; /* STATA file */
55: char filestatal[10][FILENAMELENGTH]; /* STATA dictionary files */
56: char filelog[FILENAMELENGTH]; /* Log file */
57:
58: FILE *ficlog, *ficres, *ficdat, *ficreso, *ficsas, *ficstata, *ficstatal[10];
59:
60:
61: static unsigned char const ascii_to_ebcdic[] =
62: {
63: '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
64: '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
65: '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
66: '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
67: '\100', '\117', '\177', '\173', '\133', '\154', '\120', '\175',
68: '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
69: '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
70: '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
71: '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
72: '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
73: '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
74: '\347', '\350', '\351', '\112', '\340', '\132', '\137', '\155',
75: '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
76: '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
77: '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
78: '\247', '\250', '\251', '\300', '\152', '\320', '\241', '\007',
79: '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
80: '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
81: '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
82: '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
83: '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
84: '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
85: '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
86: '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
87: '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
88: '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
89: '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
90: '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
91: '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
92: '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
93: '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
94: '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
95: };
96:
97: static unsigned char const ascii_to_ibm[] =
98: {
99: '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057',
100: '\026', '\005', '\045', '\013', '\014', '\015', '\016', '\017',
101: '\020', '\021', '\022', '\023', '\074', '\075', '\062', '\046',
102: '\030', '\031', '\077', '\047', '\034', '\035', '\036', '\037',
103: '\100', '\132', '\177', '\173', '\133', '\154', '\120', '\175',
104: '\115', '\135', '\134', '\116', '\153', '\140', '\113', '\141',
105: '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
106: '\370', '\371', '\172', '\136', '\114', '\176', '\156', '\157',
107: '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
108: '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326',
109: '\327', '\330', '\331', '\342', '\343', '\344', '\345', '\346',
110: '\347', '\350', '\351', '\255', '\340', '\275', '\137', '\155',
111: '\171', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
112: '\210', '\211', '\221', '\222', '\223', '\224', '\225', '\226',
113: '\227', '\230', '\231', '\242', '\243', '\244', '\245', '\246',
114: '\247', '\250', '\251', '\300', '\117', '\320', '\241', '\007',
115: '\040', '\041', '\042', '\043', '\044', '\025', '\006', '\027',
116: '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
117: '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010',
118: '\070', '\071', '\072', '\073', '\004', '\024', '\076', '\341',
119: '\101', '\102', '\103', '\104', '\105', '\106', '\107', '\110',
120: '\111', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
121: '\130', '\131', '\142', '\143', '\144', '\145', '\146', '\147',
122: '\150', '\151', '\160', '\161', '\162', '\163', '\164', '\165',
123: '\166', '\167', '\170', '\200', '\212', '\213', '\214', '\215',
124: '\216', '\217', '\220', '\232', '\233', '\234', '\235', '\236',
125: '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
126: '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
127: '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
128: '\312', '\313', '\314', '\315', '\316', '\317', '\332', '\333',
129: '\334', '\335', '\336', '\337', '\352', '\353', '\354', '\355',
130: '\356', '\357', '\372', '\373', '\374', '\375', '\376', '\377'
131: };
132:
133: static unsigned char const ebcdic_to_ascii[] =
134: {
135: '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177',
136: '\227', '\215', '\216', '\013', '\014', '\015', '\016', '\017',
137: '\020', '\021', '\022', '\023', '\235', '\205', '\010', '\207',
138: '\030', '\031', '\222', '\217', '\034', '\035', '\036', '\037',
139: '\200', '\201', '\202', '\203', '\204', '\012', '\027', '\033',
140: '\210', '\211', '\212', '\213', '\214', '\005', '\006', '\007',
141: '\220', '\221', '\026', '\223', '\224', '\225', '\226', '\004',
142: '\230', '\231', '\232', '\233', '\024', '\025', '\236', '\032',
143: '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
144: '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041',
145: '\046', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
146: '\260', '\261', '\135', '\044', '\052', '\051', '\073', '\136',
147: '\055', '\057', '\262', '\263', '\264', '\265', '\266', '\267',
148: '\270', '\271', '\174', '\054', '\045', '\137', '\076', '\077',
149: '\272', '\273', '\274', '\275', '\276', '\277', '\300', '\301',
150: '\302', '\140', '\072', '\043', '\100', '\047', '\075', '\042',
151: '\303', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
152: '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
153: '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160',
154: '\161', '\162', '\313', '\314', '\315', '\316', '\317', '\320',
155: '\321', '\176', '\163', '\164', '\165', '\166', '\167', '\170',
156: '\171', '\172', '\322', '\323', '\324', '\325', '\326', '\327',
157: '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
158: '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
159: '\173', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
160: '\110', '\111', '\350', '\351', '\352', '\353', '\354', '\355',
161: '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
162: '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363',
163: '\134', '\237', '\123', '\124', '\125', '\126', '\127', '\130',
164: '\131', '\132', '\364', '\365', '\366', '\367', '\370', '\371',
165: '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
166: '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
167: };
168:
169: /**************** split *************************/
170: static int split( char *path, char *dirc, char *name, char *ext, char *finame )
171: {
172: char *ss; /* pointer */
173: int l1, l2; /* length counters */
174:
175: l1 = strlen(path ); /* length of path */
176: if ( l1 == 0 ) return( GLOCK_ERROR_NOPATH );
177: ss= strrchr( path, DIRSEPARATOR ); /* find last / */
178: if ( ss == NULL ) { /* no directory, so use current */
179: /*if(strrchr(path, ODIRSEPARATOR )==NULL)
180: printf("Warning you should use %s as a separator\n",DIRSEPARATOR);*/
181: /* get current working directory */
182: /* extern char* getcwd ( char *buf , int len);*/
183: if ( getcwd( dirc, FILENAME_MAX ) == NULL ) {
184: return( GLOCK_ERROR_GETCWD );
185: }
186: strcpy( name, path ); /* we've got it */
187: } else { /* strip direcotry from path */
188: ss++; /* after this, the filename */
189: l2 = strlen( ss ); /* length of filename */
190: if ( l2 == 0 ) return( GLOCK_ERROR_NOPATH );
191: strcpy( name, ss ); /* save file name */
192: strncpy( dirc, path, l1 - l2 ); /* now the directory */
193: dirc[l1-l2] = 0; /* add zero */
194: }
195: l1 = strlen( dirc ); /* length of directory */
196: /*#ifdef windows
197: if ( dirc[l1-1] != '\\' ) { dirc[l1] = '\\'; dirc[l1+1] = 0; }
198: #else
199: if ( dirc[l1-1] != '/' ) { dirc[l1] = '/'; dirc[l1+1] = 0; }
200: #endif
201: */
202: l1= strlen( name);
203: ss = strrchr( name, '.' ); /* find last / */
204: if (ss != '\0'){
205: ss++;
206: strcpy(ext,ss); /* save extension */
207: l2= strlen(ss)+1;
208: }else{
209: ext[0]='\0';
210: l2 = 0;
211: }
212: strncpy( finame, name, l1-l2);
213: finame[l1-l2]= 0;
214: return( 0 ); /* we're done */
215: }
216:
217: void trzb(char *z, char *in)
218: {
219: /* Enlve les blancs en fin de cha ne et le caractre 0 qui se trouve
220: au d but s'il y est */
221: int i=0, j=0, k=0;
222: int n;
223:
224: n =strlen(in);
225: /* for(i=n;(i>=0) || (in[i]==' ');i--){ */
226: /* printf ("i=%d in[i]=%s\n",i,in[i]); */
227: /* } */
228: k=0;
229: if(in[0]== '0')
230: k=1;
231: for(j=k; j<=n;j++){
232: if(in[j]==' '){
233: z[j-k]='\0';
234: break;
235: }
236: else
237: z[j-k]=in[j];
238: }
239: z[j-k]='\0';
240: }
241:
242: main(int argc, char *argv[])
243: {
244: int numlinepar=0, ilect=0, firstpass=0, idic[10]={0,0,0,0,0,0,0,0,0,0};
245: long nobs=0, ncar=0,ncara=0, ncartes=0, nn=0, nvaris=0;
246: long c;
247: long d;
248: long numlis, ntype;
249: long n, pos;
250: int level, olevel, levelmax;
251: char scar;
252: char s;
253: char var1[4][10], varn[4][10];
254:
255: char pathtot[MAXLINE], path[MAXLINE], indexfile[FILENAMELENGTH], indexfilext[FILENAMEEXTLEN];
256: char indexfilefiname[FILENAMELENGTH];
257:
258: numlinepar=0;
259: if(argc <=1){
260: printf("\nEntrez le nom du fichier index binaire (dtrirdex) : ");
261: scanf("%s",pathtot);
262: }
263: else{
264: strcpy(pathtot,argv[1]);
265: }
266: split(pathtot,path,indexfile,indexfilext,indexfilefiname);
267: printf("pathtot=%s,\npath=%s,\nindexfile=%s \nindexfilext=%s \nindexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
268: chdir(path);
269:
270:
271: /* Log file */
272: strcat(filelog, indexfilefiname);
273: strcat(filelog,".log"); /* */
274: if((ficlog=fopen(filelog,"w"))==NULL) {
275: printf("Problem with logfile %s\n",filelog);
276: goto end;
277: }
278: fprintf(ficlog,"Log filename:%s\n",filelog);
279: fprintf(ficlog,"\n%s\n%s",version,fullversion);
280: fprintf(ficlog,"\nEntrez le nom du fichier d'index: ");
281: fprintf(ficlog,"pathtot=%s\n\
282: path=%s \n\
283: indexfile=%s\n\
284: indexfilext=%s\n\
285: indexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
286: fflush(ficlog);
287:
288:
289:
290: strcpy(filereso,"o");
291: strcat(filereso,indexfilefiname);
292: strcat(filereso,".txt");
293: if((ficreso=fopen(filereso,"w"))==NULL) { /* opened on subdirectory */
294: printf("Problem with Output resultfile: %s\n", filereso);
295: fprintf(ficlog,"Problem with Output resultfile: %s\n", filereso);
296: fflush(ficlog);
297: goto end;
298: }
299: fprintf(ficreso,"Log filename:%s\n",filelog);
300: fprintf(ficreso,"\n%s\n%s",version,fullversion);
301: fprintf(ficreso,"\nEntrez le nom du fichier d'index: ");
302: fprintf(ficreso,"pathtot=%s\n\
303: path=%s \n\
304: indexfile=%s\n\
305: indexfilext=%s\n\
306: indexfilefiname=%s\n",pathtot,path,indexfile,indexfilext,indexfilefiname);
307: fflush(ficreso);
308:
309: strcpy(filesas,"s");
310: strcat(filesas,indexfilefiname);
311: strcat(filesas,".sas");
312:
313: strcpy(filestata,"s");
314: strcat(filestata,indexfilefiname);
315: strcat(filestata,".do");
316: printf("Le nom du fichier de sortie est %s\n",filereso);
317: printf("Le nom du fichier SAS de sortie est %s\n",filesas);
318: printf("Le nom du fichier STATA de sortie est %s\n",filestata);
319:
320: for(ilect=1;ilect<=2;ilect++){
321: pos=9;nvaris=0 ;
322: level=0;
323: printf("Lecture du fichier d index pour la %d fois\n",ilect);
324: if((ficdat=fopen(indexfile,"rb"))==NULL) {
325: printf("Problem with binary file %s\n",indexfile);
326: fprintf(ficlog,"Problem with binary file %s\n",indexfile);
327: fflush(ficlog);
328: goto end;
329: }
330: if(ilect==2){
331: if((ficsas=fopen(filesas,"w"))==NULL) { /* opened on subdirectory */
332: printf("Problem with Output SAS file: %s\n", filesas);
333: fprintf(ficlog,"Problem with Output SAS file: %s\n", filesas);
334: fflush(ficlog);
335: goto end;
336: }
337: fprintf(ficsas,"*Sortie de rleda version %s *;\n* %s *;\n",version,fullversion);
338: fprintf(ficsas,"libname %s \"%s\";\n",indexfilefiname,path);
339: fprintf(ficsas,"filename a \"%s.dat\";\n",indexfilefiname );
340: fprintf(ficsas,"* Ci dessous a modifier eventuellement *;\n");
341: fprintf(ficsas,"data %s.%s0 (keep=ID)\n",indexfilefiname,indexfilefiname);
342: fprintf(ficsas," %s.%s%d (keep=%s--%s)\n",indexfilefiname,indexfilefiname,1,var1[1],varn[1]);
343: idic[1]=0;
344: for(level=2; level <=levelmax; level++){
345: fprintf(ficsas," %s.%s%d (keep=numero %s--%s)\n",indexfilefiname,indexfilefiname,level,var1[level],varn[level]);
346: idic[level]=0;
347: }
348: fprintf(ficsas," ;\n");
349: fprintf(ficsas," infile a lrecl=500 ;\n");
350: fprintf(ficsas," input id 1. @; retain numero 0; \n");
351: fprintf(ficsas,"");
352: fprintf(ficsas,"");
353: if((ficstata=fopen(filestata,"w"))==NULL) { /* opened on subdirectory */
354: printf("Problem with Output Stata file: %s\n", filestata);
355: fprintf(ficlog,"Problem with Output Stata: %s\n", filestata);
356: fflush(ficlog);
357: goto end;
358: }
359: fprintf(ficstata,"*Sortie de rleda version %s *;\n* %s *;\n",version,fullversion);
360: fprintf(ficstata,"*repertoire %s \"%s\";\n",indexfilefiname,path);
361: fprintf(ficstata,"* Ci dessous a modifier eventuellement *;\n");
362: fprintf(ficstata,"* data %s.%s0 (keep=ID)\n",indexfilefiname,indexfilefiname);
363: for(level=1; level <=levelmax; level++){
364: fprintf(ficstata,"* %s.%s%d (keep=%s--%s)\n",indexfilefiname,indexfilefiname,level,var1[level],varn[level]);
365: }
366: fprintf(ficstata,"* ;\n");
367: }
368: while((c=getc(ficdat)) != EOF){
369: ungetc(c,ficdat);
370: ntype=0;for(n=0;n<2;n++){ c=getc(ficdat); ntype+=(n+(1-n)*256)*ascii_to_ebcdic[c];}
371: fprintf(ficlog,"ntype=%d ",ntype);
372: /* printf("ntype=%d ",ntype); */
373: switch(ntype){
374: case 11 : /* 11*/
375: nobs=0;
376: for(n=0;n<2;n++){
377: c=getc(ficdat);
378: d=(n+(1-n)*256)*ascii_to_ebcdic[c];
379: nobs+=d;
380: }
381: fprintf(ficlog,"nobs=%d ",nobs);
382: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
383: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
384: printf(" %s\n", title);
385: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
386: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
387: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
388: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
389: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
390: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
391: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
392: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
393: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
394: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
395: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
396: break;
397: case 12: /* 12 */
398: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
399: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
400: printf(" %s\n", title);
401: ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
402: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
403: for(n=0;n<8;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
404: olevel=level;
405: level=title[0]-48;
406: printf(" Niveau = %d Colonnes 1 8 = %s\n",level,title);
407: fprintf(ficlog," Niveau = %d Colonnes 1 8 = %s\n",level,title);
408: fprintf(ficreso," Niveau = %d Colonnes 1 8 = %s\n",level,title);
409: if(level ==0){
410: if(ilect==2){
411: fprintf(ficsas," if id=%d then do;\n",level);
412: /* fprintf(ficstata,"* if id=%d then do;\n",level); */
413: /* fprintf(ficsas," input @9 "); */
414: }
415: }
416: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
417: ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
418: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
419: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
420: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
421: for(n=0;n<2;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"\"%s\" ",title);
422: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
423: break;
424: case 10: /* 10 = 142 ascii*/
425: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
426: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
427: printf(" %s\n", title);
428: trzb(namevar,title);
429: ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
430: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
431: ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
432: ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
433: printf(" %s %d\n",namevar,ncara);
434: fprintf(ficreso," %s %d\n",namevar,ncara);
435: ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
436: break;
437: case 14: /* 14 */
438: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
439: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
440: trzb(namevar,title);
441: printf("%d %20s ", level, namevar);
442: fprintf(ficreso,"%d %20s ",level, namevar);
443: fprintf(ficlog,"Variable \"%s\" \n",namevar);
444: ncartes=0;for(n=0;n<2;n++){ c=getc(ficdat); ncartes+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncartes=%d ",ncartes);
445: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
446: ncara=0;for(n=0;n<2;n++){ c=getc(ficdat); ncara+=(n+(1-n)*256)*ascii_to_ebcdic[c]; } fprintf(ficlog,"ncara=%d ",ncara);
447: printf(" %6d",ncara); /* Nombre de caractres */
448: fprintf(ficreso," %6d",ncara); /* Nombre de caract res */
449: ncar=0;for(n=0;n<2;n++){ c=getc(ficdat); ncar+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"ncar=%d ",ncar);
450: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
451: trzb(namevara,title);
452: printf("%10s ", namevara); /* Association */
453: fprintf(ficreso,"%10s ", namevara); /* Association */
454: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
455: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
456: for(n=0;n<2;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"\"%s\"",title);
457: printf("%3s", title); /* Brute C ou Calcule R */
458: fprintf(ficreso,"%3s", title); /* Brute C ou Calcul e R */
459: if(strrchr(title,'C')!= 0 || strrchr(title,'G')!=0){
460: if(level!=olevel){
461: pos=9;
462: firstpass=0;
463: if(ilect==2){
464: if(olevel==1){
465: fprintf(ficsas," ;\n output %s.%s%d;\n",indexfilefiname,indexfilefiname,olevel);
466: }else if (olevel==2){
467: fprintf(ficsas," ;\n numero +1;\n output %s.%s%d;\n",indexfilefiname,indexfilefiname,olevel);
468: }
469: fflush(ficsas);
470: if(idic[olevel]!=0)
471: fprintf(ficstatal[olevel],"\n}\n");
472: fprintf(ficsas," end\n");
473: }
474: if(level !=0){
475: if(ilect==2){
476: fprintf(ficsas," ;\n else if id=%d then do;\n",level);
477: if(idic[level]==0){
478: sprintf(filestatal[level],"s%s-dict%d.dct",indexfilefiname,level);
479: fprintf(ficlog,"\nOutput Stata dictionary: %s\n", filestatal[level]);
480: if((ficstatal[level]=fopen(filestatal[level],"w"))==NULL) { /* opened on subdirectory */
481: printf("Problem with Output Stata dictionary file: %s\n", filestatal[level]);
482: fprintf(ficlog,"Problem with Output Stata dictionary: %s\n", filestatal[level]);
483: fflush(ficlog);
484: goto end;
485: }
486: idic[level]=1;
487: /* fprintf(ficstatal[level],"* Sortie de rleda version %s, %s\n",version,fullversion ); */
488: /* fprintf(ficstatal[level],"* Nom de fichier %s et chemin \"%s\";\n* Stata dictionary\n",indexfilefiname,path); */
489: fprintf(ficstatal[level],"dictionary using \"%s.dat\"{\n",indexfilefiname );
490: }
491: }
492: }
493: if(ilect==2){
494: fprintf(ficsas," input @9 ");
495: if(idic[level]!=0)
496: fprintf(ficstatal[level]," str1 id _column(9) ");
497: printf(" input @9 ");
498: }
499: if(ilect==1){
500: levelmax=level;
501: }
502: olevel=level;
503: }
504: printf(" %d-%d", pos, pos+(ncara-1));
505: fprintf(ficreso," %d-%d", pos, pos+(ncara-1));
506: for(n=0;n<strlen(namevar);n++){
507: if(namevar[n]=='-')
508: break;
509: }
510: namevar[n]='\0';
511: if(ilect==1){
512: if(firstpass==0){
513: strcpy(var1[level],namevar);
514: printf(" Variable premiere %s, niveau %d namevar=%s\n",var1[level],level, namevar);
515: firstpass=1;
516: }
517: else{
518: strcpy(varn[level],namevar);
519: printf(" Variable N %s, niveau %d namevar=%s\n",varn[level],level, namevar);
520: }
521: }
522: if(ilect==2){
523: fprintf(ficsas, " %s $%d.", namevar, ncara);
524: fprintf(ficstatal[level], " str%d %s %%%ds", ncara, namevar, ncara);
525: }
526: pos+=ncara;nvaris++ ;
527: if (nvaris>=5) {
528: if(ilect==2){
529: fprintf(ficsas,"\n ") ;
530: fprintf(ficstatal[level],"\n ") ;
531: }
532: nvaris=0 ;
533: }
534: }
535: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
536: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
537: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
538: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
539: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"%s ",title);
540: trzb(namevar,title);
541: printf(" %10s\n", namevar); /* format */
542: fprintf(ficreso," %10s", namevar); /* format */
543: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
544: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0';fprintf(ficlog,"%s ",title);
545: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
546: break;
547: default: fprintf(ficlog,"Warning ntype=%d cas non prvu, voir les fichiers sources",ntype);
548: nobs=0;for(n=0;n<2;n++){ c=getc(ficdat); nobs+=(n+(1-n)*256)*ascii_to_ebcdic[c];} fprintf(ficlog,"nobs=%d ",nobs);
549: for(n=0;n<30;n++){ c=getc(ficdat); title[n]=c;} title[n]='\0'; fprintf(ficlog,"%s ",title);
550: printf(" %s\n", title);
551: }
552: n=0;
553: while((c=getc(ficdat)) !='\r'){
554: if(ncara != 0)
555: nn= n % ncara;
556: else
557: nn=0;
558: title[nn]=c;
559: if(nn==ncara-1){
560: title[nn+1]='\0';
561: fprintf(ficlog," \"%s\"",title);
562: printf(" \"%s\"",title);
563: fprintf(ficreso," \"%s\"",title);
564: n=n+1;
565: }else{
566: n=n+1;
567: }
568: }
569: if(c=='\r')
570: if((c=getc(ficdat))=='\n');
571: else ungetc(c,ficdat);
572: fprintf(ficlog,"\n");
573: fprintf(ficreso,"\n");
574: } /* End of read loop */
575: fclose(ficdat);
576: } /* End loop ilect */
577:
578: fprintf(ficsas," ;\n output %s.%s%d;\n end;\n else input;\nrun;\n",indexfilefiname,indexfilefiname,level);
579: fprintf(ficstatal[level],"\n}\n");
580: for(level=0; level <=levelmax; level++){
581: fprintf(ficsas,"proc contents data=%s.%s%d;run;\n",indexfilefiname,indexfilefiname,level);
582: /* fprintf(ficstata,"*proc contents data=%s.%s%d;run;\n",indexfilefiname,indexfilefiname,level); */
583: if(level==2){
584: fprintf(ficstata,"clear\n quiet infile using s%s-dict%d if id==\"%d\"\n gen long numero=_n\n sort numero\nsave %s%d,replace\n",indexfilefiname,level,level,indexfilefiname,level);
585: }
586: else if(level==3){
587: fprintf(ficstata,"clear\n quiet infile using s%s-dict%d if id != \"1\"\n gen long numero=1 if id==\"2\"\n replace numero=sum(numero)\n sort numero\n",indexfilefiname,level);
588: fprintf(ficstata,"* merge numero using %s2\n* drop numero\n drop if id != \"3\"\nsave %s%d,replace\n",indexfilefiname,indexfilefiname,level);
589: }
590: }
591: fclose(ficsas);
592: fclose(ficstata);
593: printf("Le nom du fichier de debug est %s\n",filelog);
594: printf("Le nom du fichier du format de sortie est %s\n",filereso);
595: printf("Le nom du fichier SAS de sortie est %s\n",filesas);
596: printf("Le nom du fichier STATA de sortie est %s\n",filestata);
597: for(level=1;level<=levelmax;level++){
598: fclose(ficstatal[level]);
599: printf("Le nom du fichier STATA dictionnaire niveau %d de sortie est %s\n",level,filestatal[level]);
600: }
601: fclose(ficreso);
602: fclose(ficlog);
603: exit(0);
604: end:
605: fclose(ficlog);
606: exit(1);
607:
608: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>