Combinazione di due stringheCIAO,
Ho 2 colonne che contengono stringhe nel seguente formato:
string1 = 1;0;2;0;0;8;0
string2 = 0;1;0;3;5;0;13
Nota 1: entrambe le stringhe contengono lo stesso numero di ";" (ma non sono necessariamente della stessa lunghezza).
Nota 2: le due stringhe hanno 0 in posizione alternata.
Nota 3: una stringa può contenere due 0 di fila (separati da ";") purché l'altra stringa abbia due termini diversi da zero di fila nelle stesse posizioni.
Voglio creare una nuova colonna (string3) che è il risultato dell'unione delle due colonne senza gli 0. Per l'esempio sopra:
string3 = 1;1;2;3;5;8;13
Quindi la stringa3 dovrebbe avere lo stesso numero di ";" come stringa1 e stringa2 e deve contenere tutti i termini compresi tra ";" per ordine, senza 0.
C'è un modo per farlo usando solo formule semplici? In alternativa, utilizzando altri metodi come i loop?
Vedere file allegato.
Grazie,
Yotam
Modellazione statistica avanzataMiscelazione e pulizia dei datiPersonalizzazione di massaCondivisione e comunicazione dei risultatiRe: Combinare due stringheVedo che questo ha già alcune soluzioni ma dato che hai usato i numeri di Fibonacci hai attirato la mia attenzione;)
Ecco un'altra formula che opera direttamente sulle stringhe (supponendo che siano archiviate in colonne denominate string1 e string2, rispettivamente) convertendole in matrici, aggiungendo le matrici e riconvertendo il risultato in una stringa.
Saluti,
Brady
Substitute( Char( Parse( "[" || Substitute( :string1, ";", "," ) || "]" ) + Parse( "[" || Substitute( :string2, ";", "," ) || "]" ) ),
"[", "",
"]", "",
",", ";",
" ", ""
);
Inoltre, non sono sicuro che sia fattibile utilizzare i separatori di virgola invece dei punti e virgola, ma in tal caso la formula diventa un po' più semplice.
Substitute( Char( Eval( Parse( Eval Insert( "[^:string1^] + [^:string2^]" ) ) ) ),
"[", "",
"]", "",
" ", ""
)
Re: Combinare due stringheMentre @txnelson E @Craige_Hales ti ha dato alcune opzioni interessanti e utili, se ho capito correttamente la tua situazione, può essere fatto in una formula senza loop.
Ecco la formula con cui sono finito, prima come immagine e poi in JSL (che può essere incollata nell'editor di formule).

If( !Is Missing( :string1 ) & !Is Missing( :string1 ),
string1list = Words( :string1, ";" );
string2list = Words( :string2, ";" );
Concat Items( string1list[Loc( string1list, "0" )] = string2list[Loc( string1list, "0" )], ";" );
,
""
)
Questo usa il Parole() funzione per convertire le stringhe in liste. Utilizza il Loc() funzione per restituire una matrice di posizioni degli 0 in string1 e la utilizza come indice sia per string1list (sul lato sinistro di un'assegnazione) sia per string2list (sul lato destro di tale assegnazione). Infine il Elementi concatenati() La funzione riconverte l'elenco in una stringa delimitata da punto e virgola.
Se qualcosa di tutto ciò è confuso o non ha senso, fammelo sapere e spiegherò ulteriormente.
Re: Combinare due stringheGrazie!
Sfortunatamente al momento non ho ancora JMP16, ma questa soluzione sembra sicuramente molto elegante!
Re: Combinare due stringheFantastico.
Grazie!
Re: Combinare due stringhe@DonMcCormack - Penso che questo potrebbe essere un grande problema di sfida.
- come rilevare e gestire gli errori nelle stringhe (non numeri, zeri non corrispondenti, lunghezza non uguale)
- come renderlo veloce per 1E6 punto e virgola
modifica: utilizzo di JMP 16 Per ogni lato ciclo continuo:
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"
Re: Combinare due stringheEcco una formula che funzionerà.Ho allegato una nuova tabella dati con una nuova colonna formula
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;
La formula non controlla la situazione in cui gli zeri si trovano nella stessa posizione su entrambe le stringhe, né la situazione in cui gli zeri potrebbero apparire nella stessa posizione su entrambe le stringhe.Non sono state definite regole su come gestire tali situazioni.Se tali problemi devono essere verificati, la modifica della formula sarà una questione semplice.