Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
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