读取和操作.csv文件

时间:2013-05-07 01:50:43

标签: vb.net

我每个月都有多个.csv文件,如:

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

格式为:日期格式为dd / mm / yy,当前时间,当前温度,当前湿度,当前露点,当前风速,当前阵风,当前风向

程序需要计算平均值 温度 湿度 风速 风向

并将其显示在文本框中。

任何想法?

这是我到目前为止所做的......

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

2 个答案:

答案 0 :(得分:1)

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    

答案 1 :(得分:0)

我不会使用这种方式 - 如果列的顺序发生变化,您的程序将显示错误的结果。 我会使用像http://kbcsv.codeplex.com/这样的好的csv阅读器,并将数据读入数据表。那么你可以非常容易和可靠地计算你的结果列,因为你可以像MyDatatable.Cooumns [“Headername”]那样对每一列进行地址处理。