SAS扫描功能分离器不能正常工作

SAS扫描功能分离器不能正常工作,sas,Sas,我遇到了sas中的扫描功能问题 我拥有的数据集包含一个需要拆分为多个变量的变量 变量的结构如下所示: 4_uuuJ04_uuu1_uuuuSCH175_uuube_uuuu合成器/安排器_uu合成器/ 贝沃克(空白)1 17 108.03 93.7 我使用此代码将其拆分为多个变量: data /*ULB.*/work.smart_BCSS_withNISS_&JJ.&K.; set work.smart_BCSS_withNISS_&JJ.

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

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

变量的结构如下所示:

4_uuuJ04_uuu1_uuuuSCH175_uuube_uuuu合成器/安排器_uu合成器/ 贝沃克(空白)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_uuuJ04_uuu1_uuule_u46_uube_uuu合成器/安排器_uu合成器/ 贝沃克(空白)1 17 108.03 93.7

尽管分隔符是双下划线,但scan函数也会将此单下划线检测为分隔符


您知道如何避免这种行为吗?

您可以使用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;
data/*ULB.*/work.test;
smart=“4_uuuJ04_uuu1_uule_u18_uube_ucompositer/arranger_ucompositer/bewerker_u(空白)uu 1_uu17_u108.03_u93.7”;

smartcr=prxchange(“s/(?Aurieli的代码有效,但他们的答案无法解释原因。您对
scan
工作原理的理解是不正确的

  • 如果为
    scan
    指定的分隔符中有超过1个字符,则每个字符都将被视为分隔符。您已经指定了
    \uu
    两次。如果您指定了
    ab
    ,则
    a
    b
    都将被视为分隔符,而不是
    ab
    作为分隔符
  • 默认情况下,
    scan
    将多个连续分隔符视为单个分隔符,这就是为什么您的代码将
    \uuu
    \uu
    都视为分隔符。因此,如果您指定
    ab
    作为分隔符字符串,则
    ba
    等默认情况下也将计为单个分隔符

  • 有趣的是,infle语句支持分隔符字符串


    为什么要在分隔符列表中两次列出同一分隔符?因为我不知道SAS会将其视为两个分隔符,而将其视为一个分隔符。使用正则表达式进行简单的文本替换似乎有点过火。
    smartcr=tranwrd(smart,''.'''^')…scan(smartcr,1,'^'))…
    @Tom我同意最好修复double,但问题的原因是(“refclient中有时是单'.'),我决定使用regex。但是喜欢使用infle分隔符的答案:)
    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;