SAS代码:字符串中的制表符数

SAS代码:字符串中的制表符数,sas,Sas,我正在SAS中导入一个以制表符分隔的文件,但在某些数据行中可能有许多额外的制表符。为了验证所有行是否具有相同数量的制表符分隔符,我想计算每个数据行中制表符的数量。如何在SAS中实现这一点?对于普通字符(例如“;”或“|”),下面的代码可以正常工作,但我不知道如何引用制表符,因为'09'x在count()函数中不起作用: DATA output_file; drop inrecord; INFILE "input_file" LRECL=1000

我正在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;
使用
countc()

(注意:在堆栈溢出时,需要将制表符手动添加到
数据行
行的末尾,因为它们被转换为空格)


Count
CountC
都应该工作。
'09'x
应该在
Count
内部工作

CountC
对于字符分隔的数据和可能必须在ASCII和EBCDIC平台上运行的代码,使用修饰符将更加灵活

仅使用
input;
语句即可将整行读入输入缓冲区,该缓冲区可通过自动变量
\u infle\u
访问

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
目标是子字符串参数,
CountC
单字符目标在charlist参数中。如果有多个分隔符,请使用
CountC

Count()和CountC()都可以

ntabs1=count(_infile_,'09'x);
ntabs2=countc(_infile_,'09'x);
要想真正修复该文件,您需要两件事中的一件

首先,额外的制表符可能是以反斜杠作为前缀进行转义的。只需查看其中一个错误行并确定它们是否是这样做的。您可以使用
TRANWRD()
函数将任何反斜杠+制表符更改为其他字符,如管道

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;

一些单独的值包含制表符是真正的问题吗?为了能够解析文件,那么那些包含分隔符的值应该用引号括起来。文件中是否缺少引号?是的,我的问题是一些字符串变量中可能有额外的制表符,并且我的da中没有引号t@Richard的回答添加了一些有趣的功能,但都很有效。谢谢。你的代码运行得很好,特别是我不知道的infle自动变量。谢谢。
 data _null_;
   infile "input_file";
   input;
   if countc(_infile_,'09'x)=10 then file "good_file";
   else file "bad_file";
   put _infile_;
run;