vb.net 通过流阅读器读取文本文件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10382774/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Read text file through stream reader
提问by Asif khan
I have a text file name list.txt which contains data like following;
我有一个文本文件名 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
now i have to pick three columns(AC-No,Name.Time) with entire row and give datagridview its data source. for now i am using following code but no luck.
现在我必须选择整行的三列(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
please help me.
请帮我。
回答by Rejeesh
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
回答by Andrew Morton
Assuming 1) you have shown a file with fixed column widths, 2) you will need the time as a DateTime rather than a string and 3) that AC-No. really is a string and not an integer:
假设 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
(Tested as working in VB2010 with your data as shown.)
(测试为在 VB2010 中使用您的数据,如图所示。)
回答by Tawfik Khalifeh
just a suggestion, try mystream.readtoend() and then slice at every vbnewline after that your have a separate string for each row, where u can debug it and play around until you get the right result.
只是一个建议,尝试 mystream.readtoend() 然后在每个 vbnewline 上切片,之后每行都有一个单独的字符串,您可以在其中调试它并进行播放,直到得到正确的结果。