Большинство моих данных считываются в формате с фиксированной шириной, например fixedwidth.txt:
00012000ABC
0044500DEFG
345340000HI
00234000JKL
06453MNOPQR
Где первые 5 символов - это colA, а следующие шесть - это colB.Код для чтения выглядит примерно так:
infile "&path.fixedwidth.txt" lrecl = 397 missover;
input colA $5.
colB $6.
;
label colA = 'column A '
colB = 'column B '
;
run;
Однако некоторые из моих данных поступают откуда-то еще и форматируются как CSV без начальных нулей, например example.csv:
colA,colB
12,ABC
445,DEFG
34534,HI
234,JKL
6453,MNOPQR
Поскольку данные csv добавляются к существующим данным, считываемым из файла с фиксированной шириной, я хочу точно соответствовать форматированию.
Код, который я до сих пор читал в example.csvэто:
data work.example;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&path./example.csv" delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;
informat colA $5.;
informat colB $6.;
format colA z5.; *;
format colB z6.; *;
input
colA $
colB $
;
if _ERROR_ then call symputx('_EFIERR_',1); /* set ERROR detection macro variable */
run;
Но форматы z5.& z6.работает только со столбцами, отформатированными как числовые, поэтому это не работает и выдает следующие данные:
ColA colB
12 ABC
445 DEFG
34534 HI
234 JKL
6453 MNOPQR
Когда я хочу:
ColA colB
00012 000ABC
00445 00DEFG
34534 0000HI
00234 000JKL
06453 MNOPQR
С обоими столбцами, отформатированными как символы.
В идеале я хотел бы найти способ получения нужного мне результата, используя только форматы и информаторы, чтобы облегчить отслеживание кода (у меня есть много столбцов для отслеживания!).
Благодарен за любые предложения!