2016-04-29 12 views
3

Ich bin lächerlich fest auf diesem ein. Mein Code unten fasst alle Zahlen zusammen, die in der Textdatei Dailyfile sind, und gibt die Summe an AverageFile aus. Das Problem ist, dass ich es nicht zusammenfassen möchte. Ich möchte es die average aller Zahlen herausfinden.Wie kann ich den Durchschnitt aller Zahlen in einer Textdatei finden

Wie kann ich das tun?

Dim AverageFile As String = "C:\xxx\zzz\" & System.DateTime.Now.ToString("yyyyMMdd") & ".txt" 
Dim DailyFile As String = "C:\xxx\xxx\" & System.DateTime.Now.ToString("yyyyMMdd") & ".txt" 

      Try 
       If System.IO.File.Exists(AverageFile) Then 
        Dim total As double = 0 
        For Each line As String In IO.File.ReadAllLines(DailyFile) 

         total += Double.Parse(line) 
        Next 
        Dim objWriter As New System.IO.StreamWriter(AverageFile, false) 
        objWriter.WriteLine(total.ToString) 
        objWriter.Close() 
       Else 
        'Nothing yet 
       End If 

      Catch ex As Exception 
       lbErrors.Items.Add(String.Concat(TimeOfDay & " Error 98: File or folder might not exist. Restart application... ", ex.Message)) 
      End Try 

Die Dailyfile einfach so aussieht;

enter image description here

Ich habe auf den total 0= double.parse(line) eine Reihe von Variationen ausprobiert, weil ich, wie das ist, das Gefühl, wo das Problem liegt. Ich habe auch versucht diming the total as integer = 0. Ich bin neu im Rechnen, also weiß ich nicht, wie es läuft.

+2

versuchen 'File.ReadAllLines (Pfad) .Select (double.Parse) .Average()'. – Enigmativity

Antwort

3

Der Durchschnitt ist nur die Summe geteilt durch die Anzahl der Dinge, die Sie zusammengefasst haben. (Vorausgesetzt, dass Sie die arithmetic mean verwenden möchten, was wahrscheinlich ist, was Sie suchen.)

Dim total As double = 0 
Dim numOfLines As Integer = 0 
For Each line As String In IO.File.ReadAllLines(DailyFile) 
    numOfLines += 1 
    total += Double.Parse(line) 
Next 
Dim average As Double = total/numOfLines 
Dim objWriter As New System.IO.StreamWriter(AverageFile, false) 
objWriter.WriteLine(average.ToString) 
objWriter.Close() 

Was fehlte in Ihrem Code nur, den Überblick über die Anzahl der Linien zu halten und Dividieren der Summe durch diese Zahl.


Nur als ein Beispiel: Wir sind 3 Personen. Ich bin 23 Jahre alt, du bist 35 Jahre alt, unser Freund ist 40 Jahre alt. Die durchschnittliche unseres Alters (23 + 35 + 40)/3 wäre die 32,666 ist ...

+0

Danke, CherryDT. Das ist tatsächlich genau das, was ich vermisst habe. – MadsTheMan

+0

Ein bisschen zu spät, aber gibt es kleine Anpassungen, so dass ich zum Beispiel nur 32 als Ausgabe anstelle von 32,666 bekomme? – MadsTheMan

+1

Wenn Sie wirklich immer abrunden möchten (wie in Ihrem Beispiel), können Sie 'Math.floor (Durchschnitt)' anstelle von 'Durchschnitt' am Ende verwenden (zB' objWriter.WriteLine (Math.floor (Durchschnitt) .ToString) '). Wenn Sie die Rundung des Bankers verwenden möchten (d. H. 32,4 würde 32, aber 32,6 würde 33 werden), verwenden Sie Math.round (Durchschnitt, 0). – CherryDT

3

Entweder verwenden CherryDT's approach die Linien zu zählen und die Summe durch diese Nummer oder verwenden LINQ Enumerable.Average, zum Beispiel mit dieser prägnanten Abfrage unterteilen:

Dim allNumbers = From line In IO.File.ReadLines(DailyFile) 
       Let num = line.TryGetDouble() 
       Where num.HasValue 
       Select num.Value 
Dim average As Double = allNumbers.Average() 

ich verwendet habe extension method folgenden auf eine um die Zeichenfolge zu Nullable(Of Double) Anprobe analysieren:

Imports System.Runtime.CompilerServices 

Module StringExtensions 
    <Extension()> 
    Public Function TryGetDouble(ByVal str As String) As Nullable(Of Double) 
     If str Is Nothing Then Return Nothing 
     Dim d As Double 
     If Double.TryParse(str.Trim(), d) Then 
      Return d 
     Else 
      Return Nothing 
     End If 
    End Function 
End Module 
+0

Danke für deine Antwort und gehe so ins Detail, Tim. Ich nehme das Wissen, das du mir gibst, und ich werde die Möglichkeiten damit erkunden. – MadsTheMan

Verwandte Themen