Jump to content

Calcular valores de um ficheiro TXT


Go to solution Solved by ribeiro55,

Recommended Posts

Posted (edited)

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

Edited by a3deluxe
Posted

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"

Posted (edited)

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);
Edited by ribeiro55
Posted (edited)

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    
Edited by ribeiro55
  • Solution
Posted

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"

Posted (edited)

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

Edited by ribeiro55
Posted

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"

Posted

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

Posted

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"

Posted

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?

Posted

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"

Posted

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"

Posted

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

Posted (edited)

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 😕

Edited by ribeiro55
Posted

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   

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.