Combinando dos cuerdasHola,
Tengo 2 columnas que contienen cadenas en el siguiente formato:
string1 = 1;0;2;0;0;8;0
string2 = 0;1;0;3;5;0;13
Nota 1: Ambas cadenas contienen el mismo número de ";" (pero no tienen necesariamente la misma longitud).
Nota 2: Las dos cadenas tienen 0 en posiciones alternas.
Nota 3: una cadena puede contener dos 0 seguidos (separados por ";") siempre que la otra cadena tenga dos términos distintos de cero seguidos en las mismas posiciones.
Quiero crear una nueva columna (string3) que sea el resultado de fusionar las dos columnas sin los 0. Para el ejemplo anterior:
string3 = 1;1;2;3;5;8;13
Así que la cadena3 debería tener el mismo número de ";" como string1 y string2, y debe contener todos los términos entre ";" por orden, sin 0's.
¿Hay alguna manera de hacerlo usando solo fórmulas simples? Alternativamente, ¿usando otros métodos como bucles?
Por favor, vea el archivo adjunto.
Gracias,
Yotam
Tabla de datossecuencias de comandosRe: Combinar dos cadenasVeo que esto ya tiene algunas soluciones, pero como usaste números de Fibonacci, llamaste mi atención;)
Aquí hay otra fórmula que opera en las cadenas directamente (asumiendo que están almacenadas en columnas llamadas cadena1 y cadena2, respectivamente) convirtiéndolas en matrices, sumando las matrices y convirtiendo el resultado nuevamente en una cadena.
Salud,
Brady
Substitute( Char( Parse( "[" || Substitute( :string1, ";", "," ) || "]" ) + Parse( "[" || Substitute( :string2, ";", "," ) || "]" ) ),
"[", "",
"]", "",
",", ";",
" ", ""
);
Además, no estoy seguro de si es factible usar separadores de coma en lugar de punto y coma, pero si se hace esto, la fórmula se vuelve un poco más simple.
Substitute( Char( Eval( Parse( Eval Insert( "[^:string1^] + [^:string2^]" ) ) ) ),
"[", "",
"]", "",
" ", ""
)
Re: Combinar dos cadenasTiempo @txnelson y @Craige_Hales le dio algunas opciones interesantes y útiles, si he entendido su situación correctamente, se puede hacer en una fórmula sin bucles.
Aquí está la fórmula con la que terminé, primero como una imagen y luego en JSL (que se puede pegar en el Editor de fórmulas).

If( !Is Missing( :string1 ) & !Is Missing( :string1 ),
string1list = Words( :string1, ";" );
string2list = Words( :string2, ";" );
Concat Items( string1list[Loc( string1list, "0" )] = string2list[Loc( string1list, "0" )], ";" );
,
""
)
Esto usa el Palabras() función para convertir sus cadenas en listas. utiliza el ubicación() para devolver una matriz de ubicaciones de los 0 en string1 y la usa como índice tanto para string1list (en el lado izquierdo de una asignación) como para string2list (en el lado derecho de esa asignación). Finalmente, el Artículos de concatenación() convierte la lista de nuevo en una cadena delimitada por punto y coma.
Si algo de esto es confuso o no tiene sentido, házmelo saber y te explicaré más.
Re: Combinar dos cadenas¡Gracias!
Desafortunadamente, actualmente no tengo JMP16 todavía, ¡pero esta solución se ve muy elegante!
Re: Combinar dos cadenasFantástico.
¡Gracias!
Re: Combinar dos cadenas@DonMcCormack - Creo que esto podría ser un gran problema de desafío.
- cómo detectar y tratar los errores en las cadenas (no números, ceros no coincidentes, no de la misma longitud)
- cómo hacerlo rápido para 1E6 punto y coma
editar: Usando el JMP 16 para cada uno a través círculo:
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: Combinar dos cadenasAquí hay una fórmula que funcionará.He adjuntado una nueva tabla de datos con una nueva columna de fórmula
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 fórmula no comprueba la situación en la que se encuentran ceros en la misma ubicación en ambas cadenas, ni la situación en la que pueden aparecer ceros en la misma posición en ambas cadenas.No se definieron reglas sobre cómo manejar tales situaciones.Si es necesario verificar tales problemas, la modificación de la fórmula será un asunto simple.