2016-09-28 73 views
1

我試圖將我已讀入的文本文件名轉換爲SAS版本9.0中的合法數據集名稱。Strip和tranwrd將尾隨空格轉換爲尾部破折號

我使用的代碼如下所示(其中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 

是否有人可以告訴我,我需要改變嗎?

謝謝

+0

是否要從文件名刪除.txt擴展名? – superfluous

+0

是的,非常感謝 – gdogg371

回答

2

所有的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個字符。