你好,
我有一张像
| ID | 第 2 列 |
| ABC001235G | |
| ABC001234 | |
| ABC001235 | |
| ABC001234D | |
| ABC001234F | |
我想重新编码 ID 列,以便我所有的值,如 'ABC001234D' 和 'ABC001234F' 变成 'ABC001234' - 基本上我想删除语句中的最后一个字母。 但是,我无法通过手动过程来做到这一点。 有太多行要做,我不可能为脚本中可能使用的每个 ID 手动编写它。 寻找一种通过脚本来做到这一点的方法。 谢谢!
嗨,萨内尔!
这是一个可能对您有所帮助的公式,但您必须对 ID 变量的命名约定和准确性做出一些假设。
如果您的 ID 值始终以 3 个字符开头,您可以创建一个新列并使用以下公式:
Substr(:ID, 1, 3) ||正则表达式(:ID,“\d+”)
此公式将允许数值的长度不一致。调整公式以在 ID 值的开头具有不一致的字符数也不是太难。但是,如果有人将 ID 错误地输入为 0(数字)而不是 O(字母),或者任何其他特定的印刷错误,您可能会得到意想不到的结果。
祝你好运,
凯文
您可以使用以下公式执行此操作:
val = Reverse( :ID );
While( Is Missing( Num( Substr( val, 1, 1 ) ) ),
val = Substr( val, 2 )
);
Reverse( val );
这将删除所有尾随的非数字值
为此,我会使用正则表达式。 我曾经喜欢这个,至少在某种程度上开始使用正则表达式:正则基因也退房JMP 字符函数 - 正则表达式和来自脚本索引的正则表达式。
这是一个示例,其中包含在 JMP 中使用 Regex 删除结束字符的两种可能方法(它们也可以轻松修改以支持非大写字母):
Names Default To Here(1);
dt = New Table("Untitled 3",
Add Rows(5),
Compress File When Saved(1),
New Column("ID",
Character,
"Nominal",
Set Values(
{"ABC001235G", "ABC001234", "ABC001235", "ABC001234D", "ABC001234F"}
)
)
);
dt << New Column("Regex1", Character, Nominal, Formula(Regex(:ID, "^[A-Z]+(\d+)")));
dt << New Column("Regex2", Character, Nominal, Formula(Regex(:ID, "[A-Z]*$", "", GLOBALREPLACE);));
根据用例选择一个(易于使用示例代码测试它们如何处理不同的字符串):
第一个将从字符串的开头匹配 1 个或多个大写字符,后跟任意数量的数字(因此它将忽略数字后面的任何内容)。
第二个将匹配字符串末尾的零个或多个大写字符,并将它们替换为空字符串。