Kombination zweier SaitenHallo,
Ich habe 2 Spalten, die Zeichenfolgen im folgenden Format enthalten:
string1 = 1;0;2;0;0;8;0
string2 = 0;1;0;3;5;0;13
Hinweis 1: Beide Zeichenfolgen enthalten die gleiche Anzahl von „;“ (aber sie sind nicht unbedingt gleich lang).
Hinweis 2: Die beiden Zeichenfolgen haben abwechselnd Nullen.
Hinweis 3: Eine Zeichenfolge kann zwei Nullen in einer Zeile enthalten (getrennt durch „;“), solange die andere Zeichenfolge zwei Nicht-Null-Begriffe in einer Zeile an denselben Positionen enthält.
Ich möchte eine neue Spalte (string3) erstellen, die das Ergebnis der Zusammenführung der beiden Spalten ohne die Nullen ist. Für das obige Beispiel:
string3 = 1;1;2;3;5;8;13
Daher sollte die Zeichenfolge3 die gleiche Anzahl von „;“ haben. als string1 und string2 und muss alle Begriffe zwischen dem „;“ enthalten. auf Bestellung, ohne Nullen.
Gibt es eine Möglichkeit, dies nur mit einfachen Formeln zu tun? Alternativ andere Methoden wie Schleifen verwenden?
Bitte beachten Sie die beigefügte Datei.
Danke,
Yotam
Erweiterte statistische ModellierungDatenmischung und -bereinigungMassenanpassungErgebnisse teilen und kommunizierenBetreff: Zwei Saiten kombinierenIch sehe, dass es dafür bereits einige Lösungen gibt, aber da Sie Fibonacci-Zahlen verwendet haben, haben Sie meine Aufmerksamkeit erregt 
Hier ist eine weitere Formel, die die Zeichenfolgen direkt bearbeitet (vorausgesetzt, sie sind in den Spalten „string1“ bzw. „string2“ gespeichert), indem sie sie in Matrizen umwandelt, die Matrizen hinzufügt und das Ergebnis wieder in eine Zeichenfolge umwandelt.
Beifall,
Brady
Substitute( Char( Parse( "[" || Substitute( :string1, ";", "," ) || "]" ) + Parse( "[" || Substitute( :string2, ";", "," ) || "]" ) ),
"[", "",
"]", "",
",", ";",
" ", ""
);
Außerdem bin ich mir nicht sicher, ob es für Sie machbar ist, Komma-Trennzeichen anstelle von Semikolons zu verwenden, aber wenn dies getan wird, wird die Formel etwas einfacher.
Substitute( Char( Eval( Parse( Eval Insert( "[^:string1^] + [^:string2^]" ) ) ) ),
"[", "",
"]", "",
" ", ""
)
Betreff: Zwei Saiten kombinierenWährend @txnelson Und @Craige_Hales Ich habe Ihnen einige interessante und nützliche Optionen gegeben. Wenn ich Ihre Situation richtig verstanden habe, kann dies in einer Formel ohne Schleifen durchgeführt werden.
Hier ist die Formel, die ich am Ende erhalten habe, zuerst als Bild und dann in JSL (das in den Formeleditor eingefügt werden kann).

If( !Is Missing( :string1 ) & !Is Missing( :string1 ),
string1list = Words( :string1, ";" );
string2list = Words( :string2, ";" );
Concat Items( string1list[Loc( string1list, "0" )] = string2list[Loc( string1list, "0" )], ";" );
,
""
)
Dies nutzt die Wörter() Funktion zum Konvertieren Ihrer Zeichenfolgen in Listen. Es nutzt die Loc() Funktion, um eine Matrix der Positionen der Nullen in string1 zurückzugeben und diese als Index sowohl für string1list (auf der linken Seite einer Zuweisung) als auch string2list (auf der rechten Seite dieser Zuweisung) zu verwenden. Endlich, das Concat Items() Die Funktion konvertiert die Liste zurück in eine durch Semikolons getrennte Zeichenfolge.
Wenn irgendetwas davon verwirrend ist oder keinen Sinn ergibt, lassen Sie es mich wissen und ich erkläre es Ihnen weiter.
Betreff: Zwei Saiten kombinierenDanke!
Leider habe ich derzeit noch kein JMP16, aber diese Lösung sieht auf jeden Fall sehr elegant aus!
Betreff: Zwei Saiten kombinierenFantastisch.
Danke!
Betreff: Zwei Saiten kombinieren@DonMcCormack - Ich denke, das könnte ein großes Herausforderungsproblem sein.
- wie man Fehler in den Zeichenfolgen abfängt und damit umgeht (keine Zahlen, nicht übereinstimmende Nullen, nicht gleiche Länge)
- wie man es schnell für 1E6-Semikolons macht
Bearbeiten: Verwenden des JMP 16 Für jeden Quer Schleife:
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“
Betreff: Zwei Saiten kombinierenHier ist eine Formel, die funktionieren wird.Ich habe eine neue Datentabelle mit einer neuen Formelspalte angehängt
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;
Die Formel prüft weder den Fall, dass in beiden Zeichenfolgen Nullen an derselben Position gefunden werden, noch den Fall, dass in beiden Zeichenfolgen Nicht-Nullen an derselben Position angezeigt werden.Es wurden keine Regeln definiert, wie mit solchen Situationen umgegangen werden soll.Wenn solche Probleme überprüft werden müssen, ist eine Änderung der Formel eine einfache Angelegenheit.