Jump to content
Fórum Script Brasil
  • 0

Totalizar valores de registros numa lista


Lagluck
 Share

Question

Boa tarde pessoal,

 

Estou com um problema que está um tanto quanto complicado para mim...

Sou iniciante em Python e estou desenvolvendo uma aplicação que pega os registros do excell e busca as linhas que possuem numero de Nota Fiscal repetidas e totaliza esses valores..

Estou partindo da ideia de que devo utilizar Loops encadeados, para que, com esta estrutura eu possa buscar cada registro da planilha que possuo, verifique se existem outros registros e caso tenha irei somar os valores, tendo que manter apenas um deles.

Já tentei diversas opções mas não tenho muita ideia de como fazer...

O formato dos registros:

 

[1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," '', 'LI8150'," ''," '']


Estes campos em vermelho (por exemplo no for seria lista[9] para o valor e lista[11] para a NF) são os campos que estã envolvidos no processo de verificação.

Agradeço qualquer ajuda.

 

Abraço

 

 

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0
2 horas atrás, Lagluck disse:

Boa tarde pessoal,

 

Estou com um problema que está um tanto quanto complicado para mim...

Sou iniciante em Python e estou desenvolvendo uma aplicação que pega os registros do excell e busca as linhas que possuem numero de Nota Fiscal repetidas e totaliza esses valores..

Estou partindo da ideia de que devo utilizar Loops encadeados, para que, com esta estrutura eu possa buscar cada registro da planilha que possuo, verifique se existem outros registros e caso tenha irei somar os valores, tendo que manter apenas um deles.

Já tentei diversas opções mas não tenho muita ideia de como fazer...

O formato dos registros:

 

[1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," '', 'LI8150'," ''," '']


Estes campos em vermelho (por exemplo no for seria lista[9] para o valor e lista[11] para a NF) são os campos que estã envolvidos no processo de verificação.

Agradeço qualquer ajuda.

 

Abraço

 

 

Pessoal..

Alguém pode consegue ajudar nessa questão?

 

Vlws ;)

Link to comment
Share on other sites

  • 0

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

Link to comment
Share on other sites

  • 0
Em 08/01/2016 at 18:16, ArteEN disse:

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

ArteEN,

 

Me perdoe a demora do reply...

Na verdade eu fiz uma ordenação em lista[11] (string da NF)...

Tentei algo do tipo:

    for i in range (0,len(lista1)):
        for j in range(i +1,len(lista1)):
            if  lista1[11] == lista2[j][11]:
                lista2[j][9] = lista1[9] + lista2[j][9]
                listaFinal.append(lista2[j])
                del lista1

Mas com certeza a logica que estou usando está incorreta, não estou conseguindo entrar num acordo aqui..

Com estes encadeados ele vai dar quebra de index ou então não percorre todos.

O que estou tentando é algo que percorra em j cada item do i, mas ao localizar, some unificando e exclua a linha que já foi verificada (que está numa lista secundaria criada pra isso).

Qualquer ajuda é muito bem vinda...

 

Vlws ;)

Link to comment
Share on other sites

  • 0

Ok, eu vou fazer alguns códigos aqui para ver se te ajuda:

  1. No arquivo excel você terá todas as linhas seguindo um padrão, que é a linha que você deu de exemplo
    • [1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," ", 'LI8150'," "," "]
  2. você vai buscar dois indices [9] e [11]
    • Vou apontar um detalhe:
    • O index 9 da linha é 'Compra'
    • O index 11 é '1126P063'
    • Talvez você esteja comparando index errado

Talvez arrumando estes detalhes do index já de uma diferença

Link to comment
Share on other sites

  • 0
Em 08/01/2016 at 18:16, ArteEN disse:

A ordem dos dados seguem um padrão certo? lista[9] e e lista[11]

Quando não houver mais dados estes campos vão estar em branco correto?

Bom se você sabe que tem um padrão em todo arquivo, precisa apenas de um loop para buscar as linhas, já que lista[9] e lista [11] vão estar sempre com os dados que você quer

ArteEN,

 

Me perdoe a demora do reply...

Na verdade eu fiz uma ordenação em lista[11] (string da NF)...

Tentei algo do tipo:

    for i in range (0,len(lista1)):
        for j in range(i +1,len(lista1)):
            if  lista1[11] == lista2[j][11]:
                lista2[j][9] = lista1[9] + lista2[j][9]
                listaFinal.append(lista2[j])
                del lista1

Mas com certeza a logica que estou usando está incorreta, não estou conseguindo entrar num acordo aqui..

Com estes encadeados ele vai dar quebra de index ou então não percorre todos.

O que estou tentando é algo que percorra em j cada item do i, mas ao localizar, some unificando e exclua a linha que já foi verificada (que está numa lista secundaria criada pra isso).

Qualquer ajuda é muito bem vinda...

 

Vlws ;)

6 minutos atrás, ArteEN disse:

Ok, eu vou fazer alguns códigos aqui para ver se te ajuda:

  1. No arquivo excel você terá todas as linhas seguindo um padrão, que é a linha que você deu de exemplo
    • [1.0, 40911.0, 8810.0, 1.0, 10.0, 1.0, 'Debito', 213103.0, 2849.42,'Compra', 'NFE: 014612 / 1 EMPRESA TESTE', '1126P063'," ", 'LI8150'," "," "]
você vai buscar dois indices [9] e [11]
  • Vou apontar um detalhe:
O index 9 da linha é 'Compra' O index 11 é '1126P063' Talvez você esteja comparando index errado

Talvez arrumando estes detalhes do index já de uma diferença

Arlen,

 

Na vdd eu copei a linha errada aqui no forum, tinha mais um par de "" que na hora que eu cole não pus aqui...entre Compra e NFE e outro entre TESTE e o campo que mencionou...

As posições são essas mesmo...

Vou copiar a linha correta...

[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito         ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', '']

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito         ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']

Eu até consegui avançar um pouco na questão...

Mas o que esta complicado é o fato de que eu preciso unificar os valores corretamente, ou seja, enquanto o número da NF (lista1[11]) for igual ao lista2[j[11]]) eu vou somando...

O problema é que não estou conseguindo fazer com que funcione corretamente esta unificação.

Link to comment
Share on other sites

  • 0

Bom como eu não tenho acesso a todos os seus dados eu fiz este código baseado ao que você mostrou, acho que esta facil para você aptar ao que deseja

 

lista = [
	[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],
	[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']
]


valor = 0

for i in range(len(lista)):
    for j in range(i + 1, len(lista)):
        print("\n{}\nVerificando linha '{}' com linha '{}'".format('-' * 40, i, j))
        
        if lista[i][11] == lista[j][11]:
            print("NFE identica")
            print("\nSomando {} ao valor total".format(lista[i][9]))
            
            valor += lista[i][9]
            
            print("Parcial {}".format(valor))
            
            
print("\n\n{}\nValor final: {}".format('=' * 40, valor))

 

 

Edited by ArteEN
formatar o código devidamente
Link to comment
Share on other sites

  • 0
4 minutos atrás, ArteEN disse:

Bom como eu não tenho acesso a todos os seus dados eu fiz este código baseado ao que você mostrou, acho que esta facil para você aptar ao que deseja

 


 

lista = [

[1.0, 40912.0, 8810.0, 1.0, 1.0, 1.0, 'Debito ', 213103.0, '', 3102.63, 'Compra', 'NFE: 000009110 / 002 FILMTEC', 21143010.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 30.4, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1003.2, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', ''],

[1.0, 40912.0, 8810.0, 1.0, 3.0, 1.0, 'Debito ', 213103.0, '', 1033.6, 'Compra', 'NFE: 012290 / 0 PENTAIR HIDRO', 21143002.0, '', 'LI8150', '', '']

]

 

valor = 0

for i in range(len(lista)):

for j in range(i + 1, len(lista)):

print("\n{}\nVerificando linha '{}' com linha '{}'".format('-' * 40, i, j))

if lista[11] == lista[j][11]:

print("NFE identica")

print("\nSomando {} ao valor total".format(lista[9]))

valor += lista[9]

print("Parcial {}".format(valor))

  print("\n\n{}\nValor final: {}".format('=' * 40, valor))

 

Vou testar esse Arlen,

 

De qualquer modo já agradeço sua ajuda...

 

Att.:

Link to comment
Share on other sites

  • 0
Em 11/01/2016 at 20:12, ArteEN disse:

Da uma olhada no codigo novamente, tem alguns erros, que corrigi

Arlen,

 

Terminei o código e deu tudo certo...

Primeiramente gostaria de agradecer demais pela sua grande ajuda, foi realmente fui valiosa para eu entender o que deveria fazer a partir dali...

Estou iniciando em programação agora então ainda não tenho muita experiência, este foi meu primeiro ingresso em um fórum para obter ajuda em algo e tive uma ótima primeira impressão graças a ti.

Abaixo está o código que eu fiz e vou deixar aqui pra ajudar alguém que possa precisar no futuro, ele tem alguns "por menores" para acertar questões de posicionamento dos itens e também para não haver duplicidades dos valores já somado ou mesmo criar itens duplicados dos que não dever ser somados (por exemplo apenas um item na NF)...

(para que for utilizar este código, antes de tudo é necessário criar o lista1 e lista2 da fazer um sort organizando pela NF - em meu exemplo campo [11])

    for i in range(len(lista1)):
        for j in range(i + 1, len(lista2)):"
            if lista1[11] == lista2[j][11]:
                if lista1[11] == lista2[j-1][11] and lista1[11] != lista2[j-2][11]:
                    valor = lista2[9] +  lista2[j][9]
                else:
                    valor += lista2[j][9]
                if len(listaFinal) != 0 and listaFinal[len(listaFinal)-1][11] == lista1[11]:
                    listaFinal[len(listaFinal)-1][9] = round(valor,2)
                else:
                    valor = lista1[9] + lista2[j][9]
                    listaFinal.append(lista1)
                    listaFinal[len(listaFinal)-1][9] = round(valor)
            else:
                    if  (j + 1 == len(lista2)):
                        listaFinal.append(lista1[j])
                    elif valor != 0:
                        pass
                    else:
                        listaFinal.append(lista1)
                    valor = 0
            break

 

 

Grande abraço.

Sucesso!!!

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...