SAS扫描功能分隔符无法正常工作

时间:2019-07-04 10:30:12

标签: sas

我在sas中的扫描功能遇到问题。

我拥有的数据集包含一个变量,需要将其拆分为多个变量。

变量的结构如下:

  

4__J04__1__SCH175__BE__compositeur / rangeur__compositeur /   bewerker __(空白)__ 1__17__108.03__93.7

我使用以下代码将其拆分为多个变量:

data /*ULB.*/work.smart_BCSS_withNISS_&JJ.&K.;
                set work.smart_BCSS_withNISS_&JJ.&K.;
                /* Maand splitsen in variablen */
                mois=scan(smart,1,"__");
                jours=scan(smart,2,"__");
                nbjours=scan(smart,3,"__");
                refClient=scan(smart,4,"__");
                paysPrestation=scan(smart,5,"__");
                wordingFR=scan(smart,6,"__");
                wordingNL=scan(smart,7,"__");
                fonction=scan(smart,8,"__");
                ARTISTIQUE2=scan(smart,9,"__");
                Art_At_LEAST=scan(smart,10,"__");
                totalBrut=scan(smart,11,"__");
                totalImposable=scan(smart,12,"__");
run;

在大多数情况下,它可以完美运行。但是有时第四个变量'refClient'包含一个下划线,如下所示:

  

4__J04__1__LE_46__BE__compositeur / rangeur__compositeur /   bewerker __(空白)__ 1__17__108.03__93.7

以某种方式,即使分隔符是双下划线,扫描功能也会将此单个下划线检测为分隔符。

关于如何避免这种行为的任何想法?

3 个答案:

答案 0 :(得分:4)

Aurieli的代码有效,但是他们的答案并未解释原因。您对scan的工作方式的理解不正确。

  1. 如果为scan指定的定界符中有多个字符,则每个字符都将被视为定界符。您已两次指定_。如果您指定了ab,则ab都将被视为定界符,而不是ab被定为分隔符。
  2. scan默认将多个连续的定界符视为一个定界符,这就是为什么您的代码将___都视为定界符。因此,如果您将ab指定为分隔符字符串,则baabba等默认情况下也将被视为单个分隔符。

答案 1 :(得分:2)

您可以使用regexp更改单个“ _”(例如,更改为“-”),然后扫描所需内容:

data /*ULB.*/work.test;
                smart="4__J04__1__LE_18__BE__compositeur / arrangeur__compositeur / bewerker__(blank)__1__17__108.03__93.7";
                smartcr=prxchange("s/(?<=[^_])(_{1})(?=[^_])/-/",-1,smart);
                /* Maand splitsen in variablen */
                mois=scan(smartcr,1,"__");
                jours=scan(smartcr,2,"__");
                nbjours=scan(smartcr,3,"__");
                refClient=tranwrd(scan(smartcr,4,"__"),'-','_');
                paysPrestation=scan(smartcr,5,"__");
                wordingFR=scan(smartcr,6,"__");
                wordingNL=scan(smartcr,7,"__");
                fonction=scan(smartcr,8,"__");
                ARTISTIQUE2=scan(smartcr,9,"__");
                Art_At_LEAST=scan(smartcr,10,"__");
                totalBrut=scan(smartcr,11,"__");
                totalImposable=scan(smartcr,12,"__");
run;

答案 2 :(得分:1)

非常有趣的是,INFILE语句支持定界符字符串enter image description here

data test;
   infile cards dlmstr='__';
   input (mois
      jours
      nbjours
      refClient
      paysPrestation
      wordingFR
      wordingNL
      fonction
      ARTISTIQUE2
      Art_At_LEAST
      totalBrut
      totalImposable) (:$32.);
   cards;
4__J04__1__SCH175__BE__compositeur / arrangeur__compositeur / bewerker__(blank)__1__17__108.03__93.7
4__J04__1__LE_46__BE__compositeur / arrangeur__compositeur / bewerker__(blank)__1__17__108.03__93.7
;;;;
   run;
proc print;
   run;

enter image description here