У меня есть столбец coordinates
, который относится к идентификатору с 3 измерениями [z][x][y]
. Что я пытаюсь сделать, так это инвертировать [x]
измерение с [y]
, чтобы оно стало таблицей с (все еще) 3 измерениями, но в другом порядке: [z][y][x]
Вот фрагмент колонки:
+------------------------+
| COORDINATES |
+------------------------+
| ID_01.02.a[][01][20] |
| ID_02.00[010][02][017] |
| ID_03.01[][][010] |
| ID_04.01.w[010][][] |
+------------------------+
Вот код для воспроизведения этого фрагмента:
data have;
input coordinates :$30.;
datalines;
ID_01.02.a[][01][20]
ID_02.00[010][02][017]
ID_03.01[][][010]
ID_04.01.w[010][][]
;
Ожидается, что финальная таблица будет следующей:
+------------------------+
| COORDINATES |
+------------------------+
| ID_01.02.a[][20][01] |
| ID_02.00[010][017][02] |
| ID_03.01[][010][] |
| ID_04.01.w[010][][] |
+------------------------+
Когда я попытался использовать функцию сканирования, это не сработало, потому что я не смог найти надежный индекс, например. x_after = trim(scan(coordinates,2,'[]'))
. Действительно, если ось z не пуста, будет выведена ось z, а если ось z пуста, будет выведена ось x.
Кто-нибудь знает, почему SO показывает каждую вторую строку данных в этом вопросе наклонным шрифтом? Почему он вообще ищет подсказки форматирования в блоках данных?
Я думаю, что это связано с обработкой синтаксиса языка (еще копаю). Смешные части - это спаны с классом hljs-*
. Копаясь, я обнаружил, что HTML TABLES теперь поддерживаются! meta.stackexchange.com/questions/356997/…
Расскажите о курсиве после подчеркивания в мета. meta.stackoverflow.com/questions/402864/…
Обходной путь, по-видимому, заключается в том, чтобы указать none в качестве языка кода ```none
Вы можете получить доступ к мощности регулярных выражений через PRXCHANGE
для изменения значений, содержащих как простые, так и сложные шаблоны.
Пример:
data have;
input COORDINATES $char50.;
datalines;
ID_01.02.a[][01][20]
ID_02.00[010][02][017]
ID_03.01[][][010]
ID_04.01.w[010][][]
;
data want;
set have;
put coordinates;
coordinates = prxchange
( 's/(.*?\[.*?\])(\[.*?\])(\[.*\])/$1$3$2/'
, 1
, coordinates
);
put coordinates /;
run;
Журналы
ID_01.02.a[][01][20]
ID_01.02.a[][20][01]
ID_02.00[010][02][017]
ID_02.00[010][017][02]
ID_03.01[][][010]
ID_03.01[][010][]
ID_04.01.w[010][][]
ID_04.01.w[010][][]
Вы можете сделать это с помощью SCAN(). Используйте []
в качестве разделителей и модификатор m
. Но теперь ваши строки имеют 6 значений, а не 4, так как между местами с ][
есть пустые значения.
Вот способ, который показывает, что происходит.
data have;
input COORDINATES $50.;
cards;
ID_01.02.a[][01][20]
ID_02.00[010][02][017]
ID_03.01[][][010]
ID_04.01.w[010][][]
;
data want;
set have;
length want $50;
array temp[6] $50;
do i=1 to dim(temp);
temp[i]=scan(coordinates,i,'[]','m');
end;
want = cats(temp[1],'[',temp[2],'][',temp[6],'][',temp[4],']');
drop i;
run;
Полученные результаты:
Obs COORDINATES want temp1 temp2 temp3 temp4 temp5 temp6
1 ID_01.02.a[][01][20] ID_01.02.a[][20][01] ID_01.02.a 01 20
2 ID_02.00[010][02][017] ID_02.00[010][017][02] ID_02.00 010 02 017
3 ID_03.01[][][010] ID_03.01[][010][] ID_03.01 010
4 ID_04.01.w[010][][] ID_04.01.w[010][][] ID_04.01.w 010
с небольшим изменением вы все еще можете использовать свою программу:
x_after = trim(scan(tranwrd(coordinates,'[]','[ ]'),2,'[]'))
.