首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扫描函数分隔符不能正常工作

扫描函数分隔符不能正常工作
EN

Stack Overflow用户
提问于 2019-07-04 10:30:12
回答 3查看 1.3K关注 0票数 2

我在sas中遇到了扫描函数的问题。

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

变量的结构如下:

4__J04__1__SCH175__BE__compositeur / arrangeur__compositeur /bewerker__(空白)__1__17__108.03__93.7

我使用这段代码将其拆分为多个变量:

代码语言:javascript
复制
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 / arrangeur__compositeur /bewerker__(空白)__1__17__108.03__93.7

尽管分隔符是双下划线,但扫描函数也会将这个单独的下划线检测为分隔符。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-04 11:04:46

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

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2019-07-04 11:12:03

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

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

Stack Overflow用户

发布于 2019-07-05 16:09:06

稍微有趣的是,INFILE语句支持分隔符字符串。

代码语言:javascript
复制
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;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56885998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档