读取每行不读取整个文件

时间:2014-08-25 18:36:30

标签: vb.net windows

我正在使用Vb获取.txt文件,解析它并检查错误。我的代码工作正常,但代码不会遍历整个文件。平均而言,它比EOF少了20行。

我正在使用以下

For Each lines As String In System.IO.File.ReadLines(myFile)

从这里我解析该行,看看它是否需要任何修复。

是否有我遗漏的东西或者无法避免的东西。

我正在阅读的文件大约是150,000 KB到230,000 KB,超过200万行。

根据要求,以下是我的代码。警告,我刚开始使用Vb ......

    Module Module1

Sub Main()
    Dim root As String = "C:\Users\mschramm\Documents\Agco\WindSensor\Data\filestobecleaned\"
    Dim datafile As String = root & "ES.txt"
    Dim outfile As String = root & "temptry.txt"

    Dim output As System.IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(outfile, False)
    Dim k As UInteger = 0
    Dim fixes As UInteger = 0
    Dim time As ULong = 0
    Dim count As UInteger = 0
    Dim n As UInteger = 0
    Dim LineCount As UInteger = 0
    Dim TimeStep As ULong = 100
    Dim Solar As UInteger = 0

    For Each lines As String In System.IO.File.ReadLines(datafile)
        LineCount = LineCount + 1

        'Console.WriteLine(LineCount)

        Dim parsedline As String() = Split(lines, ",")

        If IsNumeric(parsedline(0)) = True And UBound(parsedline) = 8 Then
            'TimeStep = parsedline(0) - time
            Solar = parsedline(1)
            time = parsedline(0)
            output.WriteLine(lines & "    Good Line")
            count = count + 1

        Else

            Dim j As UInteger = 0
            Dim ETX As Integer = 0
            Dim STX As Integer = 0
            Dim datacheck As Boolean = False
            Dim fixedline As String = ""
            Dim newtime As ULong = 0

            For j = 0 To UBound(parsedline)
                Dim a As Char = parsedline(j)
                If a = (Chr(3)) Then ETX = j
                If a = (Chr(2)) Then STX = j
            Next

            j = 0
            If (STX < ETX) And (ETX - STX) = 6 And STX >= 2 Then
                If Len(parsedline(STX + 1)) = 8 And Len(parsedline(STX + 2)) = 8 And Len(parsedline(STX + 3)) = 8 Then
                    Dim g = Len(parsedline(STX - 2))
                    While (j < g) And datacheck = False
                        If IsNumeric(parsedline(STX - 2)) Then
                            If parsedline(STX - 2) - time < 10000 And parsedline(STX - 2) - time > 0 Then
                                newtime = Right(parsedline(STX - 2), Len(parsedline(STX - 2)))
                                Solar = parsedline(STX - 1)
                                'TimeStep = newtime - time
                                fixedline = newtime & "," & parsedline(STX - 1) & "," & parsedline(STX) & "," & parsedline(STX + 1) & "," & parsedline(STX + 2) & "," & parsedline(STX + 3) & "," & parsedline(STX + 4) & "," & parsedline(STX + 5) & "," & parsedline(STX + 6) & "   Fixed Line"
                                datacheck = True
                            Else
                                j = j + 1
                                parsedline(STX - 2) = Right(parsedline(STX - 2), Len(parsedline(STX - 2)) - 1).ToString
                            End If
                        Else
                            j = j + 1
                            parsedline(STX - 2) = Right(parsedline(STX - 2), Len(parsedline(STX - 2)) - 1).ToString
                        End If
                    End While
                End If
            End If

            If (STX < ETX) And (ETX - STX) = 6 And STX = 0 Then
                If Len(parsedline(1)) = 8 And Len(parsedline(2)) = 8 And Len(parsedline(3)) = 8 And Len(parsedline(4)) = 1 And Len(parsedline(5)) = 2 And Len(parsedline(6)) = 3 Then
                    newtime = time + TimeStep
                    fixedline = newtime & "," & Solar & "," & parsedline(STX) & "," & parsedline(STX + 1) & "," & parsedline(STX + 2) & "," & parsedline(STX + 3) & "," & parsedline(STX + 4) & "," & parsedline(STX + 5) & "," & parsedline(STX + 6) & "   Fixed Line Gave Time and Solar"
                    datacheck = True
                End If
            End If

            If newtime < time And newtime > 1000 Then
                Dim badtime As ULong = newtime
                Dim firstdig As ULong = time
                Dim loopcount As UInteger = 0
                While firstdig > 9
                    firstdig = firstdig / 10
                    loopcount = loopcount + 1
                End While
                firstdig = firstdig * (10 ^ loopcount)
                If (firstdig + badtime) > time Then
                    newtime = firstdig + badtime
                    If (newtime - (10 ^ loopcount)) > time Then
                        newtime = newtime - (10 ^ loopcount)
                    End If
                End If
            End If

            If datacheck = True Then
                k = k + 1
                If (newtime > 500) Then
                    output.WriteLine(fixedline)
                    'count = count + 1
                    time = newtime
                End If
            End If

            If datacheck = False Then
                n = n + 1
                If STX >= 0 And ETX > 0 And ETX - STX < 9 Then
                    Console.WriteLine(LineCount)
                    'n = n + 1
                End If
            End If

        End If
    Next
    Console.WriteLine(count & "  Good lines")
    Console.WriteLine(k & "  Lines Corrected")
    Console.WriteLine(LineCount & " Total Lines")
    Console.WriteLine(n & " Lines were thrown out")
    Console.WriteLine(n / LineCount * 100 & "% thrown out")

End Sub

结束模块

这是一个数据样本

Time: 16:52:18.0
Date: 11/6/2014
Time,Sensor1,U,V,W
544161,219,Q,-001.341,+000.947,+000.140,M,00,17
544284,218,Q,-001.207,+001.074,+000.225,M,00,1C
544361,220,Q,-000.935,+000.898,+000.187,M,00,17
544460,220,Q,-001.299,+001.151,-000.009,M,00,17

这是最后10行的样子

Q,+001.681,-003.510,-0356154697,236,Q,+000.826,-002.744,-000.559,M,00,19
Q,+000.474,-002.789,-0356155062,234,Q,+000.400,-002.975,+000.438,M,00,1D
Q,+000.813,-002.934,-0356155297,236,Q,+000.146,-002.129,-000.235,M,00,16
Q,+000.494,-002.234,+0356155497,236,Q,+000.681,-001.996,-000.248,M,00,1F
Q,+000.800,-001.999,-0356155697,236,Q,+001.181,-002.883,-000.795,M,00,1A
356156060,233,Q,+000.400,-002.106,+000.251,M,00,18
356156296,235,Q,+000.888,-001.026,+000.442,M,00,10
356156495,236,Q,+000.570,-001.694,+000.589,M,00,13
356156695,236,Q,+001.495,-002.177,-000.035,M,00,15
356157060,234,Q,+000.770,-003.484,-000.161,M,00,14

对于此文件,代码使其到达第6行到最后一行。

1 个答案:

答案 0 :(得分:1)

感谢mafafu指出解决方案。

我从未关闭过该文件,因此添加output.Close()修复了所有内容。

再次感谢mafafu。