組合兩個字符串你好,
我有兩列包含以下格式的字符串:
string1 = 1;0;2;0;0;8;0
string2 = 0;1;0;3;5;0;13
注1:兩個字符串包含相同數量的“;” (但它們的長度不一定相同)。
注 2:兩個字符串的 0 交替出現。
注3:一個字符串可以連續包含兩個0(用“;”分隔),只要另一個字符串在同一位置連續有兩個非零項即可。
我想創建一個新列(string3),它是合併不帶 0 的兩列的結果。 對於上面的例子:
string3 = 1;1;2;3;5;8;13
所以 string3 應該有相同數量的“;”作為 string1 和 string2,並且必須包含“;”之間的所有術語按順序,沒有 0。
有沒有辦法只使用簡單的公式來做到這一點? 或者,使用其他方法,例如循環?
請參閱所附文件。
謝謝,
約塔姆
高級統計建模數據混合和清理大規模定制分享和交流結果回复:合併兩個字符串我看到這已經有一些解決方案,但由於你使用了斐波那契數,你引起了我的注意;)
下面是另一個直接對字符串進行運算的公式(假設它們分別存儲在名為 string1 和 string2 的列中),方法是將它們轉換為矩陣,將矩陣相加,然後將結果轉換回字符串。
乾杯,
布雷迪
Substitute( Char( Parse( "[" || Substitute( :string1, ";", "," ) || "]" ) + Parse( "[" || Substitute( :string2, ";", "," ) || "]" ) ),
"[", "",
"]", "",
",", ";",
" ", ""
);
另外,我不確定您使用逗號分隔符代替分號是否可行,但如果這樣做,公式會變得更簡單一些。
Substitute( Char( Eval( Parse( Eval Insert( "[^:string1^] + [^:string2^]" ) ) ) ),
"[", "",
"]", "",
" ", ""
)
回复:合併兩個字符串儘管@tx尼爾森和@Craige_Hales給了你一些有趣和有用的選項,如果我正確理解你的情況,它可以在沒有循環的公式中完成。
這是我最終得到的公式,首先是圖片形式,然後是 JSL 形式(可以粘貼到公式編輯器中)。

If( !Is Missing( :string1 ) & !Is Missing( :string1 ),
string1list = Words( :string1, ";" );
string2list = Words( :string2, ";" );
Concat Items( string1list[Loc( string1list, "0" )] = string2list[Loc( string1list, "0" )], ";" );
,
""
)
這使用了字()函數將字符串轉換為列表。 它使用洛克()函數返回 string1 中 0 的位置矩陣,並將其用作 string1list(位於賦值的左側)和 string2list(位於該賦值的右側)的索引。 最後,連接項目()函數將列表轉換回分號分隔的字符串。
如果其中任何內容令人困惑或沒有意義,請告訴我,我將進一步解釋。
回复:合併兩個字符串謝謝!
不幸的是我目前還沒有 JMP16,但這個解決方案看起來確實非常優雅!
回复:合併兩個字符串極好的。
謝謝!
回复:合併兩個字符串@唐麥考馬克- 我認為這可能是一個很大的挑戰問題。
- 如何捕獲和處理字符串中的錯誤(非數字、不匹配的零、長度不同)
- 如何加快 1E6 分號的速度
編輯:使用 JMP 16對於每個跨越環形:
string1 = "1;0;2;0;0;8;0";
string2 = "0;1;0;3;5;0;13";
result = "";
For Each( {{w1, w2}, idx}, across( Words( string1, ";" ), Words( string2, ";" ) ),
result ||= (If( idx > 1, ",", "" ) || If( w1 == "0", w2, w1 ))
);
result;“1,1,2,3,5,8,13”
回复:合併兩個字符串這是一個可行的公式。我附加了一個帶有新公式列的新數據表
w = 1;
newString = "";
While( Word( w, :string1, ";" ) != "",
If( newString != "",
newString = newString || ","
);
If( Word( w, :string1, ";" ) != "0",
newString = newString || Word( w, :string1, ";" ),
newString = newString || Word( w, :string2, ";" )
);
w++;
);
newString;
該公式不會檢查在兩個字符串的同一位置找到零的情況,也不檢查在兩個字符串的同一位置可能出現非零的情況。沒有定義如何處理此類情況的規則。如果需要檢查此類問題,修改公式將是一件簡單的事情。