首页 > 解决方案 > 反转括号内的两个字符串

问题描述

我有一coordinates列引用了具有 3 个维度的 ID [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 轴。

标签: regexdatabasesas

解决方案


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][][]

推荐阅读