是否有一个用于从数字字符串中删除破折号而又不删除前导零的功能?

时间:2019-11-11 23:18:03

标签: sas

我想从3到9位数字中删除破折号。这些数字中有一定百分比的前导零。我尝试使用Compress函数,但是这也消除了零。最好的功能是什么?

2 个答案:

答案 0 :(得分:1)

我了解您的“数字”实际上是带有数字和破折号的代码,并且您只希望保留数字,因此您需要进行字符串处理。

SAS中的compress函数具有第二个(可选)参数。如果未指定,则该功能将删除所有空白字符。如果这样做,它将删除指定的字符。所以尝试

no_dash = compress(with_dash, '-');

或者,您可以使用第三个参数(也是可选参数)删除所有非数字字符

no_dash = compress(with_dash, '0123456789', 'k');

k指定保留而不是删除指定的字符。您可以通过在第三个参数上添加d来缩短此时间,并告诉SAS将所有数字都添加到第二个参数上:

no_dash = compress(with_dash, '', 'dk');

答案 1 :(得分:0)

如果已将压缩结果(通过隐式转换)存储在数字变量中,则该变量可能需要一种格式才能获得所需的结果。

data _null_;
  my_dashed_text = '000-90-123';
  my_compressed_text = compress(my_dashed_text, '-');

  attrib my_num_var 
    length = 8
    format = z9.
  ;
  my_num_var = compress(my_dashed_text, '-');

  put (_all_) (=/);
run;

------ LOG -----

NOTE: Character values have been converted to numeric values at the places given by:
      (Line):(Column).
      36:16

my_dashed_text=000-90-123
my_compressed_text=00090123
my_num_var=000090123

Z数字格式告诉SAS在显示数字时添加前导零,以填充到指定宽度 。格式是固定宽度,因此来自"123-456""0-1-2-3-45-6"的my_num_var将显示Z9的{​​{1}}格式值。通过单一格式规范(例如000123456)呈现时,SAS格式无法使数字值看起来像1234560123456