yolad
yolad

Reputation: 120

Reading from and manipulating a .csv file

I have multiple .csv files for each month which go like:

01/04/2012,00:00,7.521527,80.90972,4.541667,5.774305,7,281.368
02/04/2012,00:00,8.809029,84.59028,6.451389,5.797918,7,274.0764
03/04/2012,00:00,4.882638,77.86806,1.152778,15.13611,33,127.6389
04/04/2012,00:00,5.600694,50.35417,-3.826389,15.27222,33,40.05556

The format is : Date in the form dd/mm/yy,Current time,Current temperature,Current humidity,Current dewpoint,Current wind speed,Current wind gust,Current wind bearing

The program needs to calculate the average for temperature humidity wind speed wind direction

and display them on a text box.

any ideas?

Here is what I have done so far...

Option Strict On
Option Explicit On

Imports System.IO
Imports System

Public Class Form1   

Private Sub cmb1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb1.SelectedIndexChanged

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnexit.Click
    Me.Close()
End Sub

Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btndata.Click
    'This is for August
    If cmb1.SelectedIndex = 1 Then
        TextBox1.Clear()
        Using reader As New StreamReader("c://temp/DailyAug12log.csv")
            Dim line As String = reader.ReadLine()
            Dim avgTemp As Integer
            Dim fields() As String = line.Split(",".ToCharArray())
            Dim fileDate = CDate(fields(0))
            Dim fileTime = fields(1)
            Dim fileTemp = fields(2)
            Dim fileHum = fields(3)
            Dim fileWindSpeed = fields(4)
            Dim fileWindGust = fields(5)
            Dim fileWindBearing = fields(6)

            While line IsNot Nothing
                counter = counter + 1
                line = reader.ReadLine()
            End While
            avgTemp = CInt(fields(2))
            avgTemp = CInt(CDbl(avgTemp / counter))
            TextBox1.Text = TextBox1.Text & "Month = August" & vbCrLf & "Temperature Average: " & avgTemp & vbCrLf
        End Using
    End If
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim files() As String
    files = Directory.GetFiles("C:\Temp", "*.csv", SearchOption.AllDirectories)
    For Each FileName As String In files
        cmb1.Items.Add(FileName.Substring(FileName.LastIndexOf("\") + 1, FileName.Length - FileName.LastIndexOf("\") - 1))
    Next
End Sub
End Class

Upvotes: 0

Views: 1659

Answers (2)

Christian Sauer
Christian Sauer

Reputation: 10899

I would not use a this aprroach - if the order of the columns changes, your program will show wrong results. I would use a good csv reader like http://kbcsv.codeplex.com/ and read the Data to a datatable. then you can calculate your resulting columns quite easily and reliablly, because you can adress each column like MyDatatable.Cooumns["Headername"].

Upvotes: 0

adrianm
adrianm

Reputation: 14726

Private Class Weather
    Public SampleTimeStamp AS Date
    Public Temperature AS Double
    Public Humidity As Double
    Public WindSpeed AS Double
    Public WindBearing AS Double
End Class

Sub Main
    Dim samples = ReadFile("c://temp/DailyAug12log.csv")

    Dim avgTemperature = samples.Average(Function(s) s.Temperature)
    ...
End Sub

Private Function ReadFile(ByVal fileName as String) AS List(Of Weather)
    Dim samples As New List(Of Weather)
    Using tfp As new TextFieldParser(filename)
        tfp.Delimiters = new String() { "," }
        tfp.TextFieldType = FieldType.Delimited

        While Not tfp.EndOfData
            Dim fields = tfp.ReadFields()
            Dim sample As New Weather()

            sample.SampleTimeStamp = Date.ParseExact(fields(0) & fields(1), "dd\/MM\/yyyyHH\:mm", CultureInfo.InvariantCulture)
            sample.Temperature = Double.Parse(fields(2), CultureInfo.InvariantCulture)
            sample.Humidity = Double.Parse(fields(3), CultureInfo.InvariantCulture)
            sample.WindSpeed = Double.Parse(fields(4), CultureInfo.InvariantCulture)
            sample.WindBearing = Double.Parse(fields(5), CultureInfo.InvariantCulture)
            samples.Add(sample)
        End While

        Return samples
    End Using
End Function    

Upvotes: 1

Related Questions