【问题标题】:SAS code: Number of tab characters in a stringSAS 代码:字符串中制表符的数量
【发布时间】:2019-09-23 15:34:55
【问题描述】:

我正在 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;

【问题讨论】:

  • 某些单独的值包含制表符是真正的问题吗?为了能够解析文件,那些包含分隔符的值应该用引号引起来。您的文件中是否缺少引号?
  • 是的,我的问题是某些字符串变量中可能存在额外的制表符,并且我的数据中没有包含引号

标签: sas


【解决方案1】:

CountCountC 都应该可以工作。 '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

【讨论】:

  • 您的代码运行良好,尤其是 infile 自动变量,我不知道。谢谢。
【解决方案2】:

使用countc()

(注意:您需要手动将制表符添加到 datalines 行的末尾,因为它们会在 Stack Overflow 上转换为空格)

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;

【讨论】:

  • @Richard 的回答添加了一些有趣的功能,但都有效。谢谢。
【解决方案3】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2012-05-21
    • 2017-12-20
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2013-03-13
    相关资源
    最近更新 更多