组合两个字符串你好,
我有两列包含以下格式的字符串:
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;
该公式不会检查在两个字符串的同一位置找到零的情况,也不检查在两个字符串的同一位置可能出现非零的情况。没有定义如何处理此类情况的规则。如果需要检查此类问题,修改公式将是一件简单的事情。