cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
Choose Language Hide Translation Bar
View Original Published Thread

截断字符串

twaintwist
Level III

我有多个数据表,其中包含一个名为“在版本中找到”的列。主要版本通常是 4 位数字——次要版本有时会在主要版本号的末尾附加一个字母字符。出于绘图的目的,我不想显示次要版本 --- 相反,我想将次要版本与其关联的主要版本合并。例如...如果主要版本是 5.1.2.1 那么我希望次要版本 5.1.2.1a 也被称为 5.1.2.1 .....

在混合中抛出另一个皱纹----我可能还想将所有 5.1.2.x 转换为 5.1.2---- 所以 5.1.2.0、5.1.2.2a、5.1.2.3、5.1.2.4a等...将成为版本 5.1.2

当前列为‘Character’、‘Nominal’……我正在考虑根据需要/期望的详细程度将列中的字符串“截断”为 7 个字符或 5 个字符 --- 但我不确定该怎么做,或者是否有更好的方法。

此外 --- 我从不同的团队接收数据表 --- 每个团队似乎都有不同的版本控制方案 --- 因此必须内置灵活性 ----- 不确定我是否必须分析每个数据element s,并比较常见字符以查看它们是否“属于”同一版本???

undefined

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

1 ACCEPTED SOLUTION

Accepted Solutions
twaintwist
Level III

回复:截断字符串

这里的答案非常有帮助,让我觉得我可能把它弄得太复杂了——所以我尝试了字符函数“左”,但上周无法让它工作……我的语法一定是“关闭”了 --- 因为它今天对我有用..

对于每一行(:在 Vers Truncated 中找到=左(:在版本中找到,7));

---- 这只是将字符串截断到最左边的字符......这将去除较小版本的字符 --- 因为来自不同团队的版本号不一致(一些团队使用 4 位数字附加字母字符,有些使用没有附加字母字符的 3 位数字)我认为这种方法可能有效,但我必须测试使用哪个版本方案来确定截断级别....

6 REPLIES 6
hai_kuo
Level I

回复:截断字符串

你好,

不确定这是否是您想要的:

数据有;

输入 old :$10.;

牌;

5.1.2

5.1.2.1

5.1.2.1e

;

数据需要;

新长度 $5;

设置有;

新=旧;

跑步;

过程打印;运行;

海阔

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

pmroz
Super User

回复:截断字符串

这样就可以了。遍历所有值并使用正则表达式来测试每个值。

dt =当前数据表() ;

dt <<新专栏( “发现在 Vers Truncated” ,特点,名义上的) ;

为了(= 1个,<=( dt ) ,++,

测试值=柱子( dt , “在版本中找到” )[] ;

// 查看最后一个字符是否是 a 到 z 之一

如果(不见了(正则表达式(测试值, “[az]$” )) ,

// 然后

柱子( dt , “发现在 Vers Truncated” )[] =测试值;

,

// 别的

one_length =长度(测试值) ;

柱子( dt , “发现在 Vers Truncated” )[] =子字符串(测试值, 1个, ( one_length - 1个)) ;

) ;

  

) ;

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

tomkari
Level I

回复:截断字符串

抱歉使用 SAS 代码,因为我不是 JMP 用户……也许 JMP 中存在等效函数?

这非常简单也非常愚蠢,所以数据必须非常一致:

数据有;

长度 FoundInVersion $32;

输入 FoundInVersion $;

牌;

5.1.2.1

5.1.2.2

5.2.2.2a

5.2.2.3

5.2.2.3x

5.2.2.9

5.2.2.9奇怪

跑步;

数据需要;

长度 FoundInVersionGood $32;

设置有;

/* 使用句点作为分隔符,扫描第一个、第二个和第三个单词 (SCAN),然后将它们与句点 (CATX) 连接起来。 */

/* 假设总会有至少三个级别 */

FoundInVersionGood = catx(".", 扫描(FoundInVersion,1,"."), 扫描(FoundInVersion,2,"."), 扫描(FoundInVersion,3,"."));

跑步;

汤姆

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

tomkari
Level I

回复:截断字符串

另一方面,这是 ETL 的核武器,保证可以处理所有事情,但工作量更大。 如果您的不同供应商遵循截然不同的流程,您可能会发现这是唯一的选择。

只需为每个供应商创建一个唯一的一致性表:

数据有;

长度 FoundInVersion $32;

输入 FoundInVersion $;

牌;

5.1.2.1

5.1.2.2

5.2.2.2a

5.2.2.3

5.2.2.3x

5.2.2.9

5.2.2.9奇怪

跑步;

数据master_conversion;

长度 FoundInVersionGood FoundInVersion $32;

输入 FoundInVersionGood $ FoundInVersion $;

牌;

5.1.2 5.1.2.1

5.1.2 5.1.2.2

5.2.2 5.2.2.2a

5.2.2 5.2.2.3

5.2.2 5.2.2.3x

5.2.2 5.2.2.9

5.2.2 5.2.2.9奇怪

跑步;

进程 sql;

创建表想要作为

选择 FoundInVersionGood 作为 FoundInVersion

来自 master_conversion 内连接

有 (master_conversion.FoundInVersion = have.FoundInVersion);

辞职;

汤姆

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

wiebepo
Level III

回复:截断字符串

我认为正则表达式 (regex()) 可以解决这个问题。

Newcolumn("在主要版本中找到",字符,标称,

公式(正则表达式(:在版本中找到,“。*?(\d+\.\d+\.\d+)。*”,“\1”)

);

".*?(\d+\.\d+\.\d+).*" 表示找到足够的任何东西,.*?,后跟任意长度的数字,\d+,一次十进制,\.,一个数字任意长度,\d+,小数一次,\. ,任意长度的数字,\d+,后跟任何内容。 只返回括号中的部分,数字和小数,\1。

对于次要版本,将正则表达式 (regex()) 更改为多一位小数和数字。

Newcolumn("在次要版本中找到",字符,标称,

公式(正则表达式(:在版本中找到,“。*?(\d+\.\d+\.\d+\.\d+)。*”,“\1”)

);

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).

twaintwist
Level III

回复:截断字符串

这里的答案非常有帮助,让我觉得我可能把它弄得太复杂了——所以我尝试了字符函数“左”,但上周无法让它工作……我的语法一定是“关闭”了 --- 因为它今天对我有用..

对于每一行(:在 Vers Truncated 中找到=左(:在版本中找到,7));

---- 这只是将字符串截断到最左边的字符......这将去除较小版本的字符 --- 因为来自不同团队的版本号不一致(一些团队使用 4 位数字附加字母字符,有些使用没有附加字母字符的 3 位数字)我认为这种方法可能有效,但我必须测试使用哪个版本方案来确定截断级别....

This post originally written in English (US) has been computer translated for you. When you reply, it will also be translated back to English (US).