Sas 删除数据步骤中的ASCII字符

Sas 删除数据步骤中的ASCII字符,sas,Sas,查看此代码: data Work.SomeDataset; set Work.SomeDataset; SomeColumn = compress(SomeColumn, byte(34)); SomeColumn = compress(SomeColumn, byte(38)); run; 我认为这会从某个列中删除字符“(字节(34))和&(字节(38))对吗?如果是这样,有没有更有效的方法来实现这一点?这已经相当接近最佳状态,但我建议稍微改进一下: data Wor

查看此代码:

data Work.SomeDataset;
    set Work.SomeDataset;
    SomeColumn = compress(SomeColumn, byte(34));
    SomeColumn = compress(SomeColumn, byte(38));
run;

我认为这会从某个列中删除字符
(字节(34))和
&
(字节(38))对吗?如果是这样,有没有更有效的方法来实现这一点?

这已经相当接近最佳状态,但我建议稍微改进一下:

data Work.SomeDataset;
    set Work.SomeDataset;
    SomeColumn = compress(SomeColumn,'&"');
run;

这可以更清楚地显示在同一过程中删除了哪些字符,并同时删除了这两个字符。

是的,这会删除这些ascii字符。您可以通过连接在一个压缩调用中完成此操作,当然,您可以只将
'&“
传递给函数,但我认为您有理由不这样做

如果这是一个问题,您可能还希望使用COMPBL删除此进程可能创建的额外空间

data Work.want;
  set Work.have;
  someColumn = compress(someColumn,byte(34)||byte(38));
  put SomeColumn=;
run;
您还可以使用更新(SQL)或修改(数据步骤)来避免重写数据集

proc sql;
  update have
    set someColumn = compress(someColumn,byte(34)||byte(38));
quit;
也许效率更高,也许不是;如果您不能使用WHERE语句过滤掉不需要更新的情况,那么最终可能不会有什么不同,但是如果您可以(例如,如果很少使用WHERE语句),可能会更有效

编辑: 看来这不是答案。在使用1e7行的快速测试中,MODIFY的实时速度要慢得多,CPU时间也要长得多


SQL更新也非常慢,所以除非您有非常罕见的更新场景(但在您的情况下进行测试),否则我不会使用这两种方法

您可以将字符放入单个调用中

data have;
format a $12.;
a = "A" || byte(34) || "B";
output;
a = "A" || byte(34) || "B" || byte(36) || "C";
output;
run;

data want;
set have;
b = compress(a,byte(34)||byte(36));
run;