Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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 recibo | Quantidade | Descrição |
2-1171 | 0,690 | Carne moída |
2-1171 | 1 | Kit Pastel |
2-1170 | 1,610 | Filé de boi |
2-1170 | 1 | sabão em pó |
2-1170 | 1 | Pano de chão |
2-1170 | 4 | detergentes |
2-1170 | 1,192 | Filé Frango |
2-1169 | 1 | detergente |
2-1169 | 1 | Kit Pastel |
2-1169 | 1 | Azeite Andorinha Extr. Virg |
2-1168 | 1 | Farinha Trigo 1kg |
1-1248 | 1 | Pimenta Malagueta |
1-1248 | 0,884 | Filé 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,610 | Filé de boi |
2-1170 | 1 | sabão em pó |
2-1170 | 1 | Pano de chão |
2-1170 | 4 | detergentes |
Agradeço desde já,
Guilherme
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!!
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,
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