【问题标题】:Strip and tranwrd converting trailing spaces to trailing dashesStrip 和 tranwrd 将尾随空格转换为尾随破折号
【发布时间】:2016-09-29 04:22:02
【问题描述】:

我正在尝试将我读入的文本文件名转换为 SAS 版本 9.0 中的合法数据集名称。

我使用的代码是这样的(其中 fnames 是一个包含文本文件名的数据集):

data fnames;
set fnames;
filename2 = scan(filename, 1, '.');
filename3 = tranwrd(filename2, "_", "-");
filename4 = strip(filename3);
filename5 = tranwrd(filename4, " ", "-");
/*filename4 = compress(filename3);*/
filename4 = cats('_', filename4);
drop filename2 filename3;
run;

我希望它用破折号替换我的文件名中的任何空格,而不是文件名末尾的尾随空格(字段长度和格式都是 200 美元。但字符串长度本身是可变的。我的输入看起来像这样:

1080528-19-08-2016-Man Utd-v-Southampton.txt

...我的输出如下所示:

1080528-19-08-2016-Man-Utd-v-Southampton----------------------------------------------------------------------------------------------------------------------------------------------------------------

...什么时候应该是这样的:

1080528-19-08-2016-Man-Utd-v-Southampton

谁能告诉我我需要改变什么?

谢谢

【问题讨论】:

  • 是否要从文件名中删除 .txt 扩展名?
  • 是的,非常感谢

标签: sas


【解决方案1】:

所有 SAS 字符变量在其长度的末尾都包含空格。这是不可避免的——因此每次翻译空格时都需要始终使用 TRIM。因此,您不能像现在这样零散地工作-strip 并没有真正做太多事情(如果还没有,它会左对齐,但就是这样),因为它没有摆脱那些空间。 SAS 中没有varchar 的概念。

所以,这个:

filename5 = tranwrd(filename4, " ", "-");

需要:

filename5 = tranwrd(trim(filename4), " ", "-");

至少。

我会注意到,当 _ 在法律上是 SAS 数据集名称的一部分而 - 通常不是时,为什么要将 _ 转换为 - 令人困惑。

也许:

filename_fin = cats('_',translate(scan(filename,1,'.'),'__',' -'));

所以:

data _null_;
  length filename $200;
  filename= '1080528-19-08-2016-Man Utd-v-Southampton.txt';
  filename_fin = cats('_',translate(scan(filename,1,'.'),'__',' -'));
  put +4 filename= / filename_fin=;
run;

我会注意到这可能仍然不是有效的memname,因为它超过了 32 个字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2014-04-25
    • 1970-01-01
    • 2015-07-06
    • 2019-11-09
    • 2016-10-21
    相关资源
    最近更新 更多