删除datasteps中的ASCII字符

时间:2016-09-12 15:36:54

标签: sas

查看this和此代码:

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

我是否认为这会从SomeColumn中删除字符"(byte(34))和&(byte(38))?如果是这样,是否有更有效的方法来实现这一目标?

3 个答案:

答案 0 :(得分:3)

这已经非常接近最优,但是我建议稍微改进一下:

SELECT    DISTINCT  BizTalk_POA_HEADER.PONUMBER, FAN_Suppliers.SupplierName,      
FAN_Company_Details.CompanyName, FAN_Company_Details.[PrimaryEmail],   
BizTalk_POA_HEADER.[DeliveryDate]
FROM BizTalk_POA_HEADER INNER JOIN
FAN_PO_Details ON BizTalk_POA_HEADER.PONUMBER =   
CONCAT('PO',FAN_PO_Details.PoNumber) INNER JOIN
FAN_PO ON FAN_PO_Details.PurchaseOrderID = FAN_PO.PurchaseOrderID 
INNER JOIN FAN_SupplierDetails ON FAN_PO.SupplierDetailsID =    
FAN_SupplierDetails.SuppliersDetailsID INNER JOIN
FAN_Suppliers ON FAN_SupplierDetails.SupplierID = FAN_Suppliers.SupplierID  
INNER JOIN FAN_Company_Details ON FAN_PO.CompanyID =   
FAN_Company_Details.CompanyDetailsID
WHERE    (BizTalk_POA_HEADER.PONUMBER = @POID)

这样可以更清楚地删除哪些字符并在同一个传递中删除它们。

答案 1 :(得分:1)

是的,删除那些ascii字符。您可以通过连接在一个COMPRESS调用中执行此操作,当然您可以将'&"'传递给函数,但我认为您有理由不这样做。

如果这是一个问题,您可能还想使用COMPBL来删除此进程可能创建的额外空格。

data Work.want;
  set Work.have;
  someColumn = compress(someColumn,byte(34)||byte(38));
  put SomeColumn=;
run;

你也可以使用UPDATE(SQL)或MODIFY(数据步骤)来避免重写数据集......

proc sql;
  update have
    set someColumn = compress(someColumn,byte(34)||byte(38));
quit;

也许更有效率,也许不是;如果您不能使用WHERE语句来过滤掉不需要更新的案例,那么最终可能没有什么不同,但是如果可以的话(例如,如果很少这样做),它可能会更有效率。

编辑: 修改看起来不是答案。在1e7行的快速测试中,MODIFY实时严格较慢并且具有更多的CPU时间。

SQL UPDATE也很慢,所以我不会使用其中任何一个,除非你有一个非常罕见的更新场景(但在你的情况下测试)。

答案 2 :(得分:1)

您可以将这些字符放入一个电话中。

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;