Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

a3deluxe

[Resolvido] Calcular valores de um ficheiro TXT

Mensagens Recomendadas

a3deluxe    2
a3deluxe

Boa tarde,

Tenho um ficheiro txt, e dentro dele tem estes valores, agora queria somá-los todas.

1

1

2

3

2

5

10

2

Como posso fazer, usando o File.WriteAllLines

para somar os valores que estao dentro deste ficheiro txt?

Obrigado

Editado por a3deluxe

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Com o WriteAllLines não te safas. Serve literalmente para escrever linhas para o ficheiro.

Usas o ReadAllText e um split ou o ReadAllLines para apanhares o array de "números" em texto.

Depois basta somar o array tendo o cuidado de fazer o parse do inteiro.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
POB    0
POB

Boas,

Podes fazer algo deste genero:

string[] lines = File.ReadAllLines("PATH DO FICHEIRO");

int total = 0;
foreach (string line in lines)
{
     total += int.Parse(line);
}
Console.WriteLine(total);

Editado por ribeiro55

Porque programar é para todos, aprende já e com os conteúdos que mais gostas!

Sabe mais em https://www.facebook.com/ProgramarOBasico/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

O programa é um Form com uma Label, quando arranca o form mostra a leitura (soma) do ficheiro TXT na Label.

Em baixo deixo já alguma coisa que consegui fazer, mas ainda tem alguns erros.

mais uma ajudinha...

a negrito é onde tenho alguns erros.

obrigado

//   Dim myreader As New StreamReader("c:\calculos.Txt")
       Dim line As String
       Do Until myreader.EndOfStream
           line = myreader.ReadLine()

       Loop
       myreader.Close()

       Dim valor As String = "0"

       Dim total As Integer = Integer.Parse(valor)

       For Each line In line

           total += Integer.Parse(line)
       Next

       Console.WriteLine(total)
       total = Label1.Text

   End Sub    

Editado por ribeiro55

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Vários problemas com esse bloco de código, sendo o mais flagrante o facto de estares a iterar as linhas no Loop, mas a não fazer nada com elas.

E depois disso, fazes um ciclo For Each com a mesma variável no item e no iterador :)

Ali com a variável valor, também estás a fazer parse dela para o total não sei bem para que.

Por fim, em vez de colocares o total na Label, estás a colocar o texto da label no total...

Step debug e um pouco mais de atenção. Isto são erros que parecem que nem estás a tentar :(

Para além disso, o POB já te deu uma solução. Em C#, mas uma solução fácil de traduzires.

Mas vá...

       'O primeiro passo é criares uma variável Integer para guardar o valor total
       Dim TOTAL As Integer = 0
       'Depois vamos criar um StreamReader (podias também fazer com ReadAllLines / ReadAllText, mas tens o exemplo do POB)
       Dim SR As New System.IO.StreamReader("e:\zag.txt")
       'Enquanto o Reader não estiver no fim (enquanto houver informação no ficheiro)
       While Not SR.EndOfStream
           'Lê uma linha
           Dim linha As String = SR.ReadLine
           'Inicializa o valor a zero
           Dim valor As Integer = 0
           'Tenta extraír o valor numérico da linha de texto e coloca na variável valor
           Integer.TryParse(linha, valor)
           'Soma ao total a variável valor. Caso a linha não represente um número, o valor será zero (TOTAL+0 = TOTAL)
           TOTAL += valor
       End While
       'Fecha o ficheiro
       SR.Close()
       'Por fim, apresenta o resultado na label
       Label1.Text = TOTAL.ToString()


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

Boa Noite,

precisava de mais uma ajudinha, agora queria contar quantas vezes existe o numero 0.

    
       Dim ficheirotxt As String = "c:\file.txt"
       Dim number0 As String = "0"
       Dim encontrou As Boolean
       Dim valor As Integer = 0

       For Each line As String In IO.File.ReadAllLines(ficheirotxt)
           encontrou = False
           For Each procurar As String In number0
               If line.Contains(number0) Then
                   encontrou = True

                   Integer.TryParse(number0, valor)

                   number0 += valor  '-----> erro

                   Label14.Text = count.ToString
                   Exit For
               End If
           Next
           If Not encontrou Then

           End If
       Next 

Obrigado

Editado por ribeiro55

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Que valente confusão.

Se o numero0 serve para manter a frequencia do número zero, porque razão declaras como String?

Isto é tão simples como passar essa variável para Integer e no código anterior meter a seguir do parse:

If valor = 0 Then numero0+=1

Nem consigo perceber qual a tua confusão com algo deste género :(

No teu código dá erro porque estás a somar um Integer a uma String. Não te parece estranho?


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

Bom dia,

continua a dar erro neste código que substitui.

// If valor = 0 Then numero0+=1 

dá erro no numero0+=1,

diz:

(Error BC30512 Option Strict On disallows implicit conversions from 'Double' to 'String'. )

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

numero0 continua a ser uma String porque? Faz-te algum sentido que um contador seja uma String?

A sugestão era introduzir depois do parse, mas no bloco que eu te dei.

Encaixares isso no teu deveria depender de ti.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

Sim não faz sentido, porque é um numero, se fosse uma letra ai já tinha que ser string?

Alterei para Integer, agora passou a dar erro aqui TryParse e aqui line.Contains, isto porque era para ser uma string

agora passou para integer, como tenho que mudar?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Esquece o line.Contains.

Foca-te na finalidade do parse: transformar o valor da linha em número.

Se esse valor for zero......... a linha tem zero! :)

Desfaz lá o segundo ciclo For que não faz sentido nenhum. O primeiro chega-te bem.

Só tens de verificar depois do parse se o valor é zero. Se for, acrescentas um ao contador.


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

Não entendo a tua dúvida no processo. Desisto :)

       Dim ficheirotxt As String = "e:\zubzub.txt"
       Dim numero0_valor As Integer = 0, numero0_algures As Integer = 0

       For Each line As String In IO.File.ReadAllLines(ficheirotxt)
           Dim valor As Integer = 0
           If Integer.TryParse(line, valor) Then
               If valor = 0 Then numero0_valor += 1
           End If
           numero0_algures += line.ToArray().Count(Function(c As Char) c.ToString() = "0")
       Next

       MessageBox.Show(
           "Total de zeros no ficheiro: " & numero0_algures &
           vbCrLf & "Total de valores a zero: " & numero0_valor
       )


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

ribeiro55, mais uma vez obrigado,

Existe um pequeno problema, o programa esta a contabilizar também os zeros de por exemplo 100, 200

não contabiliza só os 0 sozinhos, o que pode ser?

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
POB    0
POB

a3deluxe,

O programa está tambem a contabilizar outros zeros porque o ribeiro55 deu-te a possibilidade de para alem de saberes apenas quantos zeros (com isto quero dizer, 0 e so 0) tens, deu-te tambem a possibilidade se saber quantos 0 efetivamente tens em todo o ficheiro, contanto tambem os zeros do 10,100,200..etc.

Basicamente se olhares para o teu codigo, nesta linha:

numero0_algures += line.ToArray().Count(Function(c As Char) c.ToString() = "0")

conta-te todos os zeros que tens, contanto tbm com o 100, 200, etc..

se a apagares e apagares a variavel da tua MessageBox, deixas de ver essa contagem.

Eu acho que o teu grande problema é não estares mesmo a perceber nada do que estas a fazer, ou então nem olhas-te para o que te deram :confused:

Editado por ribeiro55

Porque programar é para todos, aprende já e com os conteúdos que mais gostas!

Sabe mais em https://www.facebook.com/ProgramarOBasico/

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
a3deluxe    2
a3deluxe

POB, no meu programa substitui a msgbox por uma label1

primeiro tinha colocado assim:

//    Label1.Text = numero0_algures.ToString   

e ele contava todos os Zeros dos ficheiro

agora coloquei assim, mas ele não contabiliza bem.

//    Label1.Text = numero0_valor.ToString   

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Muryllo    8
Muryllo

Eita confusão que vem mas não sai disso. Poderias usar um ciclo for até o tamanho do arquivo -1 e usar readLine para colocar dentro de uma variável Int32, . Depois era só verificar se o inteiro era nulo ( 0 ) e adicionar +=1 na flag de contabilizar quantos zeros.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55    46
ribeiro55

       Dim ficheirotxt As String = "e:\zubzub.txt"
       Dim numero0_valor As Integer = 0

       For Each line As String In IO.File.ReadAllLines(ficheirotxt)
           Dim valor As Integer = 0
           If Integer.TryParse(line, valor) Then
               If valor = 0 Then numero0_valor += 1
           End If
       Next

       Label1.Text = numero0_valor

zaza.png

a3deluxe, TENS de olhar para o código. TENS de ler o que estás a copiar. Nunca vais entender nada se te limitares a esperar por soluções e fazer copy/paste.

Já te foi dado um número ridículo de soluções :(


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.