提取不同長度和位置的字符串我想從變量(Dx1)中提取字符串,但字符串的長度和位置各不相同,但它們之間用破折號分隔。 有時有多個破折號。 例如...
“7812-abcdef -9”
“v7892-xyz-0”
“812-fghkj-0”
“17361-gf-jhyt-9”
我想做的是創建一個新變量,用於提取第一個破折號之前的數字/字符,然後創建另一個變量,用於提取第一個破折號和第二個破折號之間的字符。所以,
變量1 變量2
第7812章
v7892 xyz
第812章
17361 GF-jhyt
我嘗試按照此處發布的示例進行操作,但它只是提取了破折號。 將 +1 更改為另一個數字會提取該數量的字符,但我的數據長度會有所不同。
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
這是我寫的。 我究竟做錯了什麼?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
回复:提取不同長度和位置的字符串這正則表達式()如果您遇到穩定性或性能問題(並且列公式中無限的 while 循環可能會令人沮喪地進行調試),則 function 可能是一個有效的替代方案。
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
回复:提取不同長度和位置的字符串再次感謝,吉姆。
我用過的行比這多得多。 這只是一個假設。
DX1 的每種情況都以數字結尾,但我為 Var2 提取的內容與該數字之間的空格數各不相同。 也許這就是造成它的原因。 不管怎樣,你的解決方案有效。
回复:提取不同長度和位置的字符串對於 JMP 來說,65,000 行並不是一個很大的表來處理。JMP 可以處理包含數十億行的數據表。問題是,數據表中的數據不一致。該代碼假設在找到 Var2 的字符值後至少會找到一個數字字段。顯然存在一種情況,Dx1 的值不以數字結尾。以下是針對該問題調整的格式更改
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
回复:提取不同長度和位置的字符串謝謝,吉姆。 我之前就是這樣嘗試的。 由於某種原因,當我運行 JMP Pro 13 時,它似乎崩潰了。 也許是因為我的數據表有65,000行?
回复:提取不同長度和位置的字符串包含的代碼是列公式。我已附加一個數據表,其中包含您在示例中使用的 Dx1 列,以及指定了列公式的新 Var1 和 Var2 列。
回复:提取不同長度和位置的字符串謝謝,吉姆。 這就是我一直在尋找的。
我如何運行這個腳本? 我嘗試將其作為列公式。 這並沒有成功,但我沒想到會成功。 我還打開了一個腳本窗口並在那裡運行它,但它只是停止響應。回复:提取不同長度和位置的字符串這是一個公式,可以按照您所說的規則進行操作......
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
但是,在上面的示例中,示例“17361-gf-jhyt -9”最終的 Var2 值為“gf-jhyt”。那是你要的嗎?
無論如何,我希望您能夠看到,您可以構建盡可能複雜的公式,因為您可能需要將字符串解析為任何正確的值。唯一的限制是您需要能夠確定需要使用的規則。
回复:提取不同長度和位置的字符串我能想到的唯一一致的規則是第二個單詞出現在數字 (#) 之間。 最終我想要連字符之間的短語。 因此,“#-word -#”和“#-word-word -#”和“#-word-word word -#”
回复:提取不同長度和位置的字符串JSL 將允許構建和解析任何這些複雜的條件。由人類來決定這種解析的規則是什麼。
在您的示例中,確定哪些連字符值應讀取為組合值以及何時將它們視為單獨值的規則是什麼?
回复:提取不同長度和位置的字符串有沒有辦法讓WORD忽略一些破折號? 我試圖提取的第二個單詞中的一些是連字符的,因此我只提取了部分內容。 例如,對於“938-ex-marine”,我得到“938”和“ex”,而不是“ex-marine”
回复:提取不同長度和位置的字符串這字函數是你的朋友。使用破折號和空格作為分隔符,您可以輕鬆提取您想要的內容。以下是在表中使用公式的示例:
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);回复:提取不同長度和位置的字符串謝謝! 效果很好。
回复:提取不同長度和位置的字符串您想要使用 Word() 函數。如果您創建一個新列“Var1”,並將以下公式放入該列中,您將得到您想要的結果
word(1,:Dx1,"-")
對於 Var2 來說,它將是:
word(2,:Dx1,"-")
Word() 函數記錄在腳本索引中
幫助==>腳本索引==>Word
回复:提取不同長度和位置的字符串@jswislar :
解決這個問題的一種方法是使用 Contains 和 Substr 函數
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);