Код SAS: количество символов табуляции в строке - PullRequest
1 голос
/ 23 сентября 2019

Я импортирую файл с разделителями табуляции в SAS, но в некоторых строках данных возможно дополнительное количество символов табуляции.Чтобы проверить, имеют ли все строки одинаковое количество разделителей табуляции, я хочу подсчитать количество символов табуляции в каждой строке данных.Как мне добиться этого в SAS?Для обычных символов (например, «;» или «|» приведенный ниже код работает нормально, но я не знаю, как ссылаться на символ табуляции, поскольку '09'x не работает внутри функции count ():

   DATA output_file;
      drop inrecord;
      INFILE "input_file"
          LRECL=1000
          dlm=';'
      MISSOVER
      DSD
      ;


   length inrecord $1000; 
    input @1 inrecord $1000.;
    dlm_count = count(inrecord,';');
    RUN;

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Count и CountC оба должны работать.'09'x должно работать внутри Count.

CountC с модификаторами, которое будет более гибким для данных и кода с разделителями символов, которые могут выполняться на платформах ASCII и EBCDIC.

Использованиетолько оператор input; для чтения всей строки во входном буфере, доступ к которому осуществляется через автоматическую переменную _infile_.

filename tabdata '....';
data _null_;
  infile tabdata lrecl=32000;

  input;

  tabcount = count(_infile_, '09'x);
  if tabcount ne lag(tabcount) and _n_ > 1 then put 'tabcount changed! ' _n_= tabcount=;
run;

Пример трех счетчиков табуляции:

data _null_;
  s = "ABC" || "09"x || "DEF" || "09"x || "GHI" || "0909090909"x;

  tabcount = count(s, "09"x);    * count when tab specified as the substring;
  tabcountc = countc(s, "09"x);  * countc with single character, the ascii tab character;
  tabcountc2 = countc(s,,'h');   * countc with modifier h for counting horizontal tabs;

  put (tabcount:) (=/);
run;
----------------- LOG ------------------
tabcount=7
tabcountc=7
tabcountc2=7

Будьте внимательны, цель Count - это аргумент substring , а цель (ы) CountC, состоящая из одного символа, содержится в аргументе charlist .Если есть несколько разделителей, используйте CountC.

1 голос
/ 23 сентября 2019

Использовать countc().

(Примечание: вам нужно будет вручную добавлять вкладки в конец строк datalines, поскольку они преобразуются в пробелы при переполнении стека)

data dr_seuss;
    length line $100.;
    infile datalines dlm=',';
    input line$;

    total_tabs = countc(line, '09'x);

    datalines;
one fish    
two fish        
red fish            
blue fish               
;
run;
0 голосов
/ 24 сентября 2019

Оба COUNT () и COUNTC () будут работать.

ntabs1=count(_infile_,'09'x);
ntabs2=countc(_infile_,'09'x);

Чтобы надеяться на исправление файла, вам понадобится одна из двух вещей.

Сначала дополнительные вкладки могли быть экранированы, если им предшествовал обратный слеш.Просто посмотрите на одну из плохих строк и решите, сделали ли они это.Вы можете использовать функцию TRANWRD(), чтобы заменить любую обратную косую черту + вкладку другим символом, например pipe.

data want;
  infile "input_file" dsd dlm='09'x truncover ;
  input @;
  _infile_=tranwrd(_infile_,'\'||'09'x,'|');
  input .... ;
run;

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

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

 data _null_;
   infile "input_file";
   input;
   if countc(_infile_,'09'x)=10 then file "good_file";
   else file "bad_file";
   put _infile_;
run;
...