Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Guilherme
Contributor II
Contributor II

Como extrair parte de um texto e transformá-lo em varias linhas com a mesma chave?

Pessoal, 

Preciso de uma grande ajuda. Tenho um arquivo de vendas que possui uma chave (número do recibo) e sua descrição (que contêm quantidade vendida e a descrição do produto do respectivo recibo) como apresentado abaixo (arquivo em CSV, campos separados por vírgula e a string em aspas duplas) :

Número do recibo,Descrição
2-1171,"0.690 x Carne moida, 1 x Kit Pastel"
2-1170,"1.610 x Filé de boi, 1 x sabão em pó, 1 x Pano de chão, 4 x detergentes, 1.192 x Filé Frango"
2-1169,"1 x detergente, 1 x Kit Pastel, 1 x Azeite Andorinha Extr. Virgem"
2-1168,"1 x Farinha Trigo 1kg"
1-1248,"1 x Pimenta Malagueta, 0.884 x Filé Frango"

 

Preciso criar um arquivo .qvd com 03 campos: número do recibo, quantidade e a sua descrição, conforme exemplo abaixo:

 

Número do reciboQuantidadeDescrição
2-1171             0,690Carne moída
2-1171                     1Kit Pastel
2-1170             1,610Filé de boi
2-1170                     1sabão em pó
2-1170                     1Pano de chão
2-1170                     4detergentes
2-1170             1,192Filé Frango
2-1169                     1detergente
2-1169                     1Kit Pastel
2-1169                     1Azeite Andorinha Extr. Virg
2-1168                     1Farinha Trigo 1kg
1-1248                     1Pimenta Malagueta
1-1248             0,884Filé Frango

 

 

Gostaria de contar com a ajuda de vocês nesta transformação pois não sei como proceder.

2-1170,"1.610 x Filé de boi, 1 x sabão em pó, 1 x Pano de chão, 4 x detergentes, 1.192 x Filé Frango"

2-1170             1,610Filé de boi
2-1170                     1sabão em pó
2-1170                     1Pano de chão
2-1170                     4detergentes

 

Agradeço desde já, 

Guilherme

4 Replies
Thiago_Justen_

Pode fazer assim:

LOAD Distinct
           "Número do recibo",
            Qtde,
            SubField(SubField(TextBetween(Descrição,'"','"'),','),'x',2)          as [Descrição];
LOAD
           "Número do recibo",
          Num(SubField(SubField(TextBetween(Descrição,'"','"'),','),'x',1)) as [Qtde],
          Descrição
FROM SEU_CSV;

 

Explicando o que eu fiz:

1 - TextBetween(Descrição,'"','"') = Retorna a string entre as aspas.

Ex.: TextBetween("0.690 x Carne moida, 1 x Kit Pastel" ,' " ' ,' " ')  resulta em 0.690 x Carne moida, 1 x Kit Pastel

 

2 -  SubField(TextBetween(Descrição,'"','"'),',') = Retorna os itens acima sem a vírgula (separador)

Ex.: SubField(TextBetween("0.690 x Carne moida, 1 x Kit Pastel", ' " ', ' " '),' , ') resulta em  duas linhas, um com 0.690 x Carne moida e outra com 1 x Kit Pastel

 

3 - SubField(SubField(TextBetween(Descrição,'"','"'),','),'x',1) = Resulta na quantidade contida no resultado acima.

Ex.: SubField(SubField(TextBetween("0.690 x Carne moida, 1 x Kit Pastel",'"','"'),','),'x',1) resulta em 2 linhas com a qtde. Uma com 0.690 e outra com 1.

 

4 - SubField(SubField(TextBetween(Descrição,'"','"'),','),'x',2) = Resulta na descrição contida no resultado do passo 2.

Ex.: SubField(SubField(TextBetween("0.690 x Carne moida, 1 x Kit Pastel",'"','"'),','),'x',2) resulta em 2 linhas com a descrição. Uma com Carne moida e outra com Kit Pastel.

 

Abs e Sucesso!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Thiago_Justen_

Ahh, e por que separei os subfields e usei um load precedente com um distinct????

 

Como o próprio help da função diz: "Se vários campos forem carregados usando Subfield(), os produtos cartesianos de todas as combinações serão criados."

 

Por isso a combinação de Distinct e Load Precedente se fez útil aí.

 

Abs e Sucesso!!!

Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago
Guilherme
Contributor II
Contributor II
Author

Thiago,

sua resposta foi fundamental para a solução.

Utilizei o Subfield como recomendou mas fiz apenas uma transformação com ele, pois utilizando como sugeriu ele estava gerando linhas somente com a quantidade e linhas comente com o produto (provavelmente apliquei de forma errada). Mas realizando as transformações aos poucos percebi que poderia separar também por busca de strings no campo texto e implementei a solução com base em sua resposta e de outras respostas aqui do fórum (achei outras repostas com termos de pesquisa em string )

Conclui minha transformação da seguinte forma:

LOAD Distinct
[Número do recibo],
Descrição,
trim(SubField(Descrição,','))as Quantidade_e_Produto
FROM [arquivo.csv]

STORE Recibo_Descrição_valor INTO [.\Recibo_Descrição_valor.qvd] (qvd);

 

LOAD [Número do recibo],
Descrição,
Quantidade_e_Produto
,FindOneOf(Quantidade_e_Produto, ' x ' ) as FindOne
,Replace(MID(Quantidade_e_Produto, 1, FindOneOf(Quantidade_e_Produto, ' x ' )),'.',',') as Quantidade
,MID(Quantidade_e_Produto, FindOneOf(Quantidade_e_Produto, ' x ' )) as Produto

 

Obrigado a todos que de alguma forma pensaram em uma resposta em especial ao Thiago pelo envio da solução

Thiago_Justen_

Perfeito Guilherme.
Mas as respostas que lhe foram úteis como corretas (nessa nova plataforma você pode aceitar até 3 como corretas) e "simbora" para os próximos desafios.

Abs e Sucesso!!
Thiago Justen Teixeira Gonçalves
Farol BI
WhatsApp: 24 98152-1675
Skype: justen.thiago