Ir ao conteúdo
  • Cadastre-se

C# Ler txt e somar números


Posts recomendados

Boa tarde,

 

Estou desenvolvendo um aplicativo simples para me ajudar em uma rotina. Tenho um arquivo de texto com números de pedido, quantidade e etc. E quero que meu programa leia ele e some para mim os produtos que forem iguais.

 

Exemplo do arquivo de texto:

 

Pedido,Serie,Filial,Terminal,Produto,Calculo,Quantidade,Quebra,Caixa,Tipo,Data,Hora,Nulo,Estorno,Devolução,Diferencial.

588602;01200633;001;09;0934;1995;0001,000;000,000;020;CX;191004;1029; ;E;D;000003
588602;01200634;001;09;0934;1995;0001,000;000,000;020;CX;191004;1029; ;E;D;000003
588602;01200635;001;09;0934;1995;0001,000;000,000;020;CX;191004;1029; ;E;D;000003
588602;01199859;001;09;0916;1995;0001,000;000,438;008;CX;191004;1029; ;E;D;000003
588602;01199863;001;09;0916;1995;0001,000;000,438;008;CX;191004;1029; ;E;D;000003
588602;01199860;001;09;0916;1995;0001,000;000,438;008;CX;191004;1029; ;E;D;000003
588602;01199861;001;09;0916;1995;0001,000;000,438;008;CX;191004;1029; ;E;D;000003
588602;01199862;001;09;0916;1995;0001,000;000,438;008;CX;191004;1029; ;E;D;000003

Programei da seguinte maneira:

 

Criei uma Classe Produtos com esses atributos:

 

namespace Interpretador
{
    class Produtos
    {
        public int pedido, serie, terminal, filial, produtos, calc, caixa, data, hora, diferencial;
        public double quantidade, quebra;
        public string estorno, devolucao, nulo, tipo;
    }
}

E no programa fiz assim: 

 

namespace Interpretador
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader LerLista = new StreamReader("C:\\RECJUN.txt");

            Produtos p = new Produtos();

            string ProdutosLidos = LerLista.ReadLine();

            while (true)
            {
                if (ProdutosLidos != null)
                {

                    string[] Lidos = ProdutosLidos.Split(';');
                    p.pedido = int.Parse(Lidos[0]);
                    p.serie = int.Parse(Lidos[1]);
                    p.filial = int.Parse(Lidos[2]);
                    p.terminal = int.Parse(Lidos[3]);
                    p.produtos = int.Parse(Lidos[4]);
                    p.calc = int.Parse(Lidos[5]);
                    p.quantidade = double.Parse(Lidos[6]);
                    p.quebra = double.Parse(Lidos[7]);
                    p.caixa = int.Parse(Lidos[8]);
                    p.tipo = (string) Lidos[9];
                    p.data = int.Parse(Lidos[10]);
                    p.hora = int.Parse(Lidos[11]);
                    p.nulo = Lidos[12];
                    p.estorno = Lidos[13];
                    p.devolucao = Lidos[14];
                    p.diferencial = int.Parse(Lidos[15]);

                    Console.WriteLine(p.produtos);
                    Console.WriteLine(p.quantidade);
                }
            }
        }
    }
}

Desse jeito o programa lê direitinho as informações, mas o que eu quero fazer é que quando um produto estiver repetido o programa some ele e me mostre a soma desse produto, mas realmente cheguei a um impasse, não sei como progredir. Se alguém puder ajudar ficarei muito grato.

Link para o comentário
Compartilhar em outros sites

Melhor que os produtos fiquem armazenados em um vetor:

std:vector <Produtos> produtos;
produtos.reserve(100);//opcional

Acrescente essa linha:

p.diferencial = int.Parse(Lidos[15]);
produtos.push_back(p);//acrescentar essa linha
                    

você então ordena os produtos pelo código do produto

class Produtos
    {
        public int pedido, serie, terminal, filial, produtos, calc, caixa, data, hora, diferencial;
        public double quantidade, quebra;
        public string estorno, devolucao, nulo, tipo
		bool operator() (Produtos p1, produtos p2) { return (p1.produtos<p2.produtos);}//acrescentar para ordenar os produtos pele cogido do produtos
    }

std::sort(produtos.begin(), produtos.end()); //depois do while

Então, varra o vector e vá somando os valores. Cada vez que o código do produto mudar você zera o contador

int codigo = -1;
int soma;
for (std::vector<Produtos>::iterator it=produtos.begin(); it!=produtos.end(); ++it)
{  
  if (codigo != it.produtos) //o codigo do produto mudou
  {
  	cout << "Produto" << codigo << ":" << soma;
    soma = 0;
    codigo = it.produtos;
  }
  soma += it.quantidade;
}

Isto é só uma ideia, não testei e pode ter alguns erros, mas o principio é esse. Veja se consegue implementar.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!