SAS: Как я могу дополнить символьную переменную нулями при чтении из csv - PullRequest
0 голосов
/ 21 сентября 2018

Большинство моих данных считываются в формате с фиксированной шириной, например 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

С обоими столбцами, отформатированными как символы.

В идеале я хотел бы найти способ получения нужного мне результата, используя только форматы и информаторы, чтобы облегчить отслеживание кода (у меня есть много столбцов для отслеживания!).

Благодарен за любые предложения!

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

SUBSTR слева.

data test;
   infile cards firstobs=2 dsd;
   length cola $5 colb $6;
   cola = '00000';
   colb = '000000';
   input (a b)($);
   substr(cola,vlength(cola)-length(a)+1)=a;
   substr(colb,vlength(colb)-length(b)+1)=b;
   cards;
colA,colB
12,ABC
445,DEFG
34534,HI
234,JKL
6453,MNOPQR
;;;;
   run;
proc print;
   run;

enter image description here

0 голосов
/ 21 сентября 2018

Вы можете использовать cats для принудительного ввода символов в столбцы csv, не зная, какие типы определил импорт csv.Выровняйте по правому краю полученное значение до ожидаемой или необходимой переменной длины и переведите заполненные пробелы в нули.

Например

data have;
  length a 8 b $7; * dang csv data, someone entered 7 chars for colB;

  a = 12;     b = "MNQ";     output;
  a = 123456; b = "ABCDEFG"; output;
run;

data want;
  set have (rename=(a=csvA b=csvB));

  length a $5 b $6;

  * may transfer, truncate or convert, based on length and type of csv variables;
  * substr used to prevent blank results when cats (number) is too long;
  * instead, the number will be truncated;
  a = substr(cats(csvA),1); 
  b = substr(cats(csvB),1);

  a = translate(right(a),'0',' ');
  b = translate(right(b),'0',' ');
run;
...