通过流阅读器读取文本文件

时间:2012-04-30 11:15:39

标签: vb.net filestream

我有一个文本文件名list.txt,其中包含以下数据;

AC-No.                 Name                Time        State    New State Exception

    100            ZULFIQUAR 09/04/2012 01:53 PM         C/In                Invalid
    100            ZULFIQUAR 10/04/2012 01:39 PM         C/In                Invalid
    100            ZULFIQUAR 11/04/2012 01:38 PM         C/In                Invalid
   1002                SAQIB 09/04/2012 10:42 PM         C/In        C/Out        OK
   1002                SAQIB 10/04/2012 08:01 AM         C/In                     OK
   1002                SAQIB 10/04/2012 10:28 PM         C/In        C/Out        OK
   1002                SAQIB 11/04/2012 09:25 AM         C/In                     OK
   1002                SAQIB 11/04/2012 10:40 PM         C/In        C/Out        OK
   1002                SAQIB 12/04/2012 07:15 AM         C/In                     OK
   1002                SAQIB 12/04/2012 11:12 PM         C/In        C/Out        OK
   1002                SAQIB 13/04/2012 07:23 AM         C/In                     OK
   1002                SAQIB 13/04/2012 10:53 PM OverTime Out                Invalid
   1002                SAQIB 14/04/2012 06:58 AM OverTime Out                Invalid
   1002                SAQIB 15/04/2012 10:50 PM         C/In                Invalid
   1002                SAQIB 16/04/2012 07:09 AM         C/In                     OK
   1002                SAQIB 17/04/2012 10:36 PM         C/In        C/Out        OK
   1002                SAQIB 18/04/2012 07:21 AM         C/In                     OK
   1002                SAQIB 18/04/2012 10:46 PM         C/In        C/Out        OK
   1002                SAQIB 19/04/2012 06:32 AM         C/In                     OK
   1002                SAQIB 19/04/2012 10:47 PM         C/In        C/Out        OK

现在我必须选择整列三列(AC-No,Name.Time),并为datagridview提供数据源。 现在我使用以下代码,但没有运气。

Dim tbl As New DataTable("mytable")
        tbl.Columns.Add("col1", GetType(String))
        'tbl.Columns.Add("col2", GetType(String))
        'tbl.Columns.Add("col3", GetType(Integer))
        Dim sFilename As String = TextBox1.Text
        Dim myStream As System.IO.StreamReader = New System.IO.StreamReader(sFilename)
        Dim line As String
        Dim aRow As DataRow
        Do
            line = myStream.ReadLine()
            If line Is Nothing Then
                Exit Do
            End If
            Dim sAry As String() = Split(line, "    ")
            aRow = tbl.NewRow
            aRow(0) = sAry(0)
            'aRow(1) = sAry(1)
            '  aRow(2) = sAry(2)
            tbl.Rows.Add(aRow)
        Loop
        myStream.Close()
        DataGridView1.DataSource = tbl

请帮帮我。

3 个答案:

答案 0 :(得分:4)

Dim delimiter As String = ","
Dim fileName As String = "c:\file.txt"

Dim sr As New StreamReader(fileName)

Try
    While sr.Peek() >= 0
        Dim r As String = sr.ReadLine()
        Dim items As String() = r.Split(delimiter.ToCharArray())
    End While
Finally
    sr.Close()
End Try

答案 1 :(得分:2)

假设1)你已经显示了一个固定列宽的文件,2)你需要时间作为DateTime而不是字符串,3)AC-No。真的是一个字符串而不是整数:

Imports System.Globalization
Sub GetData()
    Dim tbl As New DataTable("mytable")
    tbl.Columns.Add("col1", GetType(String))
    tbl.Columns.Add("col2", GetType(String))
    tbl.Columns.Add("col3", GetType(DateTime))

    Dim sFilename As String = "C:\temp\testdata.txt"

    Using myStream As System.IO.StreamReader = New System.IO.StreamReader(sFilename)
        Dim ac As String
        Dim username As String
        Dim clocktime As DateTime
        Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("en-GB")

        Dim line As String
        Dim aRow As DataRow
        While Not myStream.EndOfStream
            line = myStream.ReadLine().TrimEnd
            ' check line is long enough to be valid
            If line.Length >= 48 Then
                ' take the first 8 characters as AC-No.
                ac = line.Substring(0, 8).Trim
                ' a valid line does not start with "AC-No"
                If Not ac.StartsWith("AC-No") Then
                    ' extract the name and remove any extra spaces
                    username = line.Substring(9, 20).Trim
                    ' extract the time and convert it to a DateTime
                    clocktime = DateTime.Parse(line.Substring(29, 19), culture, DateTimeStyles.AllowWhiteSpaces)
                    aRow = tbl.NewRow
                    aRow(0) = ac
                    aRow(1) = username
                    aRow(2) = clocktime
                    tbl.Rows.Add(aRow)
                End If
            End If

        End While

    End Using

    DataGridView1.DataSource = tbl
    ' example of formatting the third column
    DataGridView1.Columns(2).DefaultCellStyle.Format = "dd-MMM-yyyy HH:mm"

End Sub

(测试为在VB2010中使用您的数据,如图所示。)

答案 2 :(得分:0)

只是一个建议,尝试mystream.readtoend(),然后在每个vbnewline切片,之后你的每一行都有一个单独的字符串,你可以在那里调试它并一直玩,直到你得到正确的结果。