Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

223
Visualizações
LAMBDA recursivo para reemplazar caracteres por sustitutos específicos de una tabla de búsqueda

El objetivo es iterar a través de las filas de la tabla de caracteres y reemplazar cada carácter con su sustituto.

La tabla de caracteres en este ejemplo es ={"&","&amp;";"<","&lt;";">","&gt;";"'","&apos;";"""","&quot;"} , o:
ingrese la descripción de la imagen aquí
*( Nota al margen: "&","&amp;" debe ser el último en la lista en este caso exacto, o reemplazará otras apariciones de sustituciones anteriores, ya que vamos del último al primero).

Fórmula:

 =LAMBDA(XML,Pos, LET( Cls,{"&","&amp;";"<","&lt;";">","&gt;";"'","&apos;";"""","&quot;"}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row=0,XML,ENCODEXML(Sub,Row-1)) ))

El resultado esperado para =ENCODEXML("sl < dk & jf") sería sl &lt; dk &amp jf
¡ #VALUE! error en su lugar.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

  1. Necesitas tener una salida en el recursivo:
 =LAMBDA(XML,Pos, LET( Cls,{"&","&amp;";"<","&lt;";">","&gt;";"'","&apos;";"""","&quot;"}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row>1,ENCODEXML(Sub,Row-1),Sub) ))
  1. Debe agregar el , en la llamada:
 =ENCODEXML("sl < dk & jf",)

ingrese la descripción de la imagen aquí

O como descubrió @Filcuk (y aprendí hace un momento) si es opcional, debe declararse usando []

es decir:

 =LAMBDA(XML,[Pos], LET( Cls,{"&","&amp;";"<","&lt;";">","&gt;";"'","&apos;";"""","&quot;"}, Row,IF(ISOMITTED(Pos),ROWS(Cls),Pos), Crf,INDEX(Cls,Row,1), Crr,INDEX(Cls,Row,2), Sub,SUBSTITUTE(XML,Crf,Crr), IF(Row>1,ENCODEXML(Sub,Row-1),Sub) ))

Entonces el , no es necesario:

 =ENCODEXML("sl < dk & jf")

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo Relatório

0

Solo para complementar la respuesta anterior de Scott; el uso de una lambda recursiva a través del administrador de nombres parece estar obsoleto (si uno no necesita explícitamente una función con nombre para su uso posterior). Dado que REDUCE() es una función recursiva por sí misma. Por lo tanto, se puede aplicar la siguiente estructura:

 =LET(X,<LookupTable>,REDUCE(<InputValue>,INDEX(X,0,1),LAMBDA(a,b,SUBSTITUTE(a,b,VLOOKUP(b,X,<ReturnCol>,0)))))

Donde:

  • <LookupTable> : se refiere a una matriz donde la columna más a la izquierda contiene los valores de búsqueda. Esto es particularmente cierto para VLOOKUP() sin embargo, con diferentes estructuras uno puede comenzar a usar XLOOKUP() (para que la solución sea más aplicable);
  • <InputValue> : una referencia a la cadena de entrada a la que necesita aplicar la sustitución;
  • <ReturnCol> - Además del primer punto: cuando se usa VLOOKUP() se debe proporcionar un índice que se refiera a la columna con los valores de reemplazo;

En el caso dado por OP, esto se traduciría en:

 =LET(X,{"&","&amp;";"<","&lt;";">","&gt;";"'","&apos;";"""","&quot;"},REDUCE("sl < dk & jf",INDEX(X,0,1),LAMBDA(a,b,SUBSTITUTE(a,b,VLOOKUP(b,X,2,0)))))
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda