2015-07-17 2 views
1

Я сделал набор данных в SAS, который читает текстовый файл по строкам. Поэтому, читая эти строки в моем наборе данных, я хочу исключить специальные символы, такие как *,%, -,; от начала и конца этой конкретной линии. какую функцию я должен использовать? Символы могут встречаться в любой последовательности, и я должен заменить их пробелом. Пожалуйста, помогите!Заменить специальные символы в SAS

+0

Что делать, если такой символ встречается посредине линии? –

+0

Нет, я просто хочу удалить с начала и конца. – Aditi

+0

Не могли бы вы разместить пример набора данных? Естественное выражение - путь вперед. –

ответ

0

Пожалуйста, взгляните на функцию перевода в sas. первый аргумент - ваша переменная, второй аргумент пуст (термин, который у вас есть), третий аргумент - это список всех ваших специальных символов, которые необходимо заменить вторым параметром.

перевод (переменная, '', '*% -');

+0

Я хочу заменить эти персонажи только с самого начала и конца, но нигде в середине. – Aditi

2
data forAditi; 
    infile datalines truncover; 
    format aLine translated parced $80.; 
    input @1 aLine $char80.; 

** Старая функция перевода в школу выполняет хорошую работу, но также переводит персонажей в середине **;

translated = translate(aLine,' ','* % - ;'); 

** Поэтому вы можете предпочесть регулярные выражения **;

retain prx_nr; 
    if _N_ EQ 1 then prx_nr = prxparse('/[ *%-;]*(.+[^ *%-;])/') ; 
    match = prxmatch(prx_nr, aLine); 
    call prxposn(prx_nr, 1, pos, len); 
    substr(parced,pos) = prxposn(prx_nr, 1, aLine); 

** [ *%-;]* ищет ноль или более специальных символов, .+ ищет 1 или более символов, что так всегда и [^ *%-;] выглядит для любого не особый характер. prxmatch будет искать максимально возможное совпадение, поэтому начиная с первого символа, специального или нет, и заканчивая последним неспецифическим символом. prxposn, однако, установить позы ition и Len GTH к части матча, заключенный в (...), то есть от первого специального символа, не до конца. Теперь, используя тот факт, что SAS повторно инициализирует все свои переменные, если явно не сохранено, нам просто нужно скопировать эту часть в нужное положение в parced **;

datalines4; 
This is text; 
--That should be cleaned up, 
And here- you have *% special characters in the middle. 
    Blanks at the start should be preserved. Right? 
;;;; 
run; 
+0

Регулярное выражение, безусловно, путь сюда. Разве не было бы проще назвать «prxchange»? – Longfish

+0

@Keith Я сомневаюсь, потому что вам нужно сохранить специальные символы посередине. –

+1

@ Dirk: не могли бы вы объяснить регулярное выражение? – Aditi

0

Вы можете использовать функцию compress для удаления специальных символов, либо с помощью определенного списка символов, или опция «р» (удалить все знаки препинания/специальные символы). Для того, чтобы убедиться, что они удаляются только в начале/конце, а также использовать substr:

 
/* Assuming 'text' is always 3 or more characters */ 
data want ; 
    set have ; 

    strStart = substr(text,1,1) ; 
    strEnd = substr(text,length(text),1) ; 
    strMid = substr(text,2,length(text)-2) ; 

    newStart = compress(strStart,,'p') ; /* remove all non-alphanumeric */ 
    newEnd = compress(strEnd ,,'p') ; 
    newStr = cats(newStart,strMid,newEnd) ; 
run ; 

Вы могли бы объединить все эти операции в одной инструкции.