São Paulo, BR - Português

Welcome & Guidelines

Find tips to make the most of your User Group experience.

LEARN MORE

Regex_replace

Andymesmo
8 - Asteroid

Olá pessoal. 

 

Sou iniciante no fórum e no uso da ferramenta Alteryx. 

 

Preciso de uma ajuda que eu suponho ser bem simples mas não estou conseguindo chegar ao resultado com o meu código. 

Estou usando o método do uso da fórmula para alterar um arquivo. Nele estou usando dentro do código o REGEX_Replace. 

 

Segue abaixo para melhor esclarecimento

 

Preciso alterar o texto de cada linha abaixo para todas ocorrências como |50| em cada linha que tenha |A170| junto com a informação na linha contendo |03|0|50| ou |03|1|50| . Exemplo:

 

|A170|1|10.05||2330975,16|0,00|03|0|50|2330975,16|1,65|38461,09|50|2330975,16|7,60|177154,11|61245||

|A170|1|17.02||466090,56|0,00|03|1|50|539278,33|1,65|8898,09|50|539278,33|7,60|40985,15|82440||

 

Escrevi o código abaixo mas não está alterando o |50| para |56|:

IIF(Left([Field_1],6) = "|A170|" AND Contains([Field_1], "|03|1|50|") OR Contains([Field_1], "|03|0|50|"),REGEX_Replace([Field_1], "^(.*)\\|50\\|(.*)$", "$1|56|$2"), [Field_1])

 

Podem por favor me ajudar? 

 

Obrigado, galera

Podem por favor me auxiliar no que posso fazer? Acredito que seja lago bem simples que estou deixando passar. 

12 REPLIES 12
JoaoLeiteV
10 - Fireball

Boa noite,

 

Sua fórmula parece estar na direção certa. Tente rodar novamente, porém deixe na expressão do Regex: "^(.*)\|50\|(.*)$". O carácter de escape é um único "\", você acabou adicionando dois e provavelmente é o motivo de não estar funcionando.

 

Espero ter ajudado!

Andymesmo
8 - Asteroid

Obrigado @JoaoLeiteV  

 

Já tinha tentado essa opção mas também não deu certo. 

Executei novamente como sugeriu e não altera.

Mesmo assim agradeço a ajuda. 

 

Grato

JoaoLeiteV
10 - Fireball

Uma dúvida, removendo 1 dos "\" que está entre o 50, o 2º número 50 da linha fica como 56, não era isso?

 

JoaoLeiteV_0-1647053274684.png

 

Se você quiser mudar o 1º, que está junto com o |03|0| ou |03|01| ai poderia usar:

IF Left([Field_1],6) = "|A170|" AND Contains([Field_1], "|03|1|50|") THEN Replace([Field_1],"|03|1|50|","|03|1|56|")
ELSEIF Left([Field_1],6) = "|A170|" AND Contains([Field_1], "|03|0|50|") THEN Replace([Field_1],"|03|0|50|","|03|0|56|")
ELSE [Field_1] ENDIF

E ficaria assim:

JoaoLeiteV_1-1647053510698.png

 

A sugestão que eu havia dado era para o primeiro caso, mudando o último 50 que aparece na linha.

Andymesmo
8 - Asteroid

É toda ocorrência como |50| deve ser modificado para |56| 

Quando a linha começar com |A170| e tiver |03|0|  ou tiver |03|1| deverá ser trocado todas ocorrências de |50| para |56| . Por isso, eu deixei no parâmetro replace a instrução como $1|56|$2 para considerar todas a linha até o primeiro grupo e depois também no segundo grupo manter, alterando somente para |56|

 

IIF(Left([Field_1],6) = "|A170|" AND
Contains([Field_1], "|03|1|50|") OR Contains([Field_1], "|03|0|50|"),REGEX_Replace([Field_1], "^(.*)\\|50\\|(.*)$", "$1|56|$2"),
[Field_1]
)

 

Andymesmo_0-1647088572595.png

 

JoaoLeiteV
10 - Fireball

Bom dia,

 

Se é pra colocar todas as ocorrências de |50|, da pra usar só um Replace normal mesmo:

JoaoLeiteV_0-1647097100487.png

IIF(Left([Field_1],6) = "|A170|" AND Contains([Field_1], "|03|1|50|") OR Contains([Field_1], "|03|0|50|"),Replace([Field_1],"|50|","|56|"),[Field_1])

 

Funcionaria pra você assim? 

Andymesmo
8 - Asteroid

Obrigado JoaoLeiteV, até serveria esse código mas, quando tentei usar, está trocando outras linhas também mesmo que não esteja dentro da regra do |03|0|50| ou |03|1|50|. Esse método é até mais fácil entretanto, se não modificasse outras linhas, eu colocaria em prática. A menos que tenha algo nessas outras linhas que não estou conseguindo ver e está sendo alterado. Abaixo segue mais algumas informações das linhas contidas no arquivo. Se copiar essas linhas para um txt e rodar o código, verá que está modificando para |56| linhas que contém |07|0|50|

 

|A170|1|10.05||2330975,16|0,00|03|0|50|2330975,16|1,65|38461,09|50|2330975,16|7,60|177154,11|61245||
|A170|1|17.02||466090,56|0,00|03|1|50|539278,33|1,65|8898,09|50|539278,33|7,60|40985,15|82440||
|A170|2|11.04||108686,79|0,00|07|0|50|108686,79|1,65|1793,33|50|108686,79|7,60|8260,19|64155||
|A170|3|11.04||74860,17|0,00|07|0|50|74860,17|1,65|1235,19|50|74860,17|7,60|5689,37|64150||
|A170|1|11.04||17776,00|0,00|13|0|50|17776,00|1,65|293,30|50|17776,00|7,60|1350,97|64160||
|A170|2|11.04||7558,00|0,00|13|0|50|7558,00|1,65|124,70|50|7558,00|7,60|574,40|64155||

Andymesmo
8 - Asteroid

Tentei usar sim, mas está alterando outras linhas que não deveriam mesmo que não esteja na regra |03|0|50|  ou  |03|1|50|

Não está aplicando apenas na regra acima. 

 

Abaixo parte do arquivo com outras linhas para teste. 

Usando o código acima sugerido, também modifica a linha que contem a informação |07|0|50| mudando para |07|0|56|  e todas ocorrências que contém o |50|

 

|A170|1|10.05||2330975,16|0,00|03|0|50|2330975,16|1,65|38461,09|50|2330975,16|7,60|177154,11|61245||

|A170|1|17.02||466090,56|0,00|03|1|50|539278,33|1,65|8898,09|50|539278,33|7,60|40985,15|82440||
|A170|2|11.04||108686,79|0,00|07|0|50|108686,79|1,65|1793,33|50|108686,79|7,60|8260,19|64155||
|A170|3|11.04||74860,17|0,00|07|0|50|74860,17|1,65|1235,19|50|74860,17|7,60|5689,37|64150||
|A170|1|11.04||17776,00|0,00|13|0|50|17776,00|1,65|293,30|50|17776,00|7,60|1350,97|64160||
|A170|2|11.04||7558,00|0,00|13|0|50|7558,00|1,65|124,70|50|7558,00|7,60|574,40|64155|| 

 

código sugerido:

IIF(Left([Field_1],6) = "|A170|" AND Contains([Field_1], "|03|1|50|") OR Contains([Field_1], "|03|0|50|"),Replace([Field_1],"|50|","|56|"),[Field_1])

JoaoLeiteV
10 - Fireball

Uma pequena mudança: Teste adicionar () entre os Contains do 03|1|50 e 03|0|50 assim:

 

IIF(Left([Field_1],6) = "|A170|" AND (Contains([Field_1], "|03|1|50|") OR Contains([Field_1], "|03|0|50|")),Replace([Field_1],"|50|","|56|"),[Field_1])

 

Usei essa fórmula acima nas linhas que você mandou e o resultado foi esse:

JoaoLeiteV_1-1647139512540.png

Ele mudou os números 50 apenas das duas primeiras.

Andymesmo
8 - Asteroid

JoaoLeiteV, me ajudou muito e com uma simples modificação de sinal (), a mágica acontece, né. Muito obrigado.

Eu reproduzi esse teste no meu ambiente. Estou usando a versão trial da ferramenta para aprendizado. 

 

Ao rodar a linha de código que disponibilizou, na minha máquina está sendo realizado as alterações em todas ocorrências |50| para |56| por incrível que pareça. Eu acredito que está certo o raciocínio mas não entendo o motivo desse comportamento na minha máquina. 

 

A falha deve estar na minha máquina ou na configuração de saída. 

Qual a saída vc usa para arquivo .txt ?

Estou usando a seguinte configuração conforme figura abaixo

 

Andymesmo_0-1647181831625.png

 

JoaoLeiteV, se eu estiver usando incorretamente, me desculpe. Estou aberto a sugestões pois sou novo mesmo no uso da ferramenta Alteryx. Eu uso mais a ferramenta KNIME (caso conheça). 

 

Ao selecionar a fórmula, se nota ao apontar o mouse que a alteração está já sendo feita em todas ocorrências. Estranho isso mostrar aqui para mim. Eu vi o seu resultado no print e é exatamente isso que preciso, da forma que mostrou. 

Caso identifique algo que eu tenha que fazer, eu agradeço. 

 

Mas, por tudo que tem ajudado, JoaoLeiteV, estou muito grato. Não identificando essa configuração, fica em paz. O resultado com  a linha de código já está certa. 

Obrigado. 

Labels