我创建了一个文本文件,其中包含在该日期购买的日期和产品。我想在单击按钮时读取文件,并且仅在当前日期(今天的日期)将产品返回到VB.net中的列表框中。任何帮助表示赞赏。
这是我的文本文件的一个例子。
06:35 Sunday, 15 March 2015
Corona Bottle
Miller Bottle
Bulmers Bottle
Beamish Pint
Bacon Fries
Orange Juice
06:41 Sunday, 15 March 2015
Murphy's Pint
Bulmers Pint
Tayto
Purple Snack
这是我到目前为止的代码:
Private Sub btnTodaysTrans_Click(sender As Object, e As EventArgs) Handles btnTodaysTrans.Click
Dim sr As IO.StreamReader = IO.File.OpenText("ProductsSold.txt")
lstTodaysTrans.Items.Clear()
Do While sr.Peek <> -1
lstTodaysTrans.Items.Add(sr.ReadLine)
Loop
sr.Close()
End Sub
答案 0 :(得分:0)
尝试使用textparser进行操作。它将类似于
dim field as string
dim date as datetime
If File.Exists(yourfilename) Then
Using parser As New TextFieldParser(yourfilename)
parser.SetDelimiters(vbTab)
While Not parser.EndOfData
fields = parser.ReadFields()
if IsDate(fields) Then
date= DateTime.ParseExact(fields, "yyyy-MM-dd HH:mm tt", System.Globalization.CultureInfo.InvariantCulture)
if date.value<> your condition Then
'' what you want
else
''what you want
end if
end if
end while
end if
注意
否则您可以使用将文本文件转换为datetime时遇到的错误作为检查它是否为有效日期的条件。
答案 1 :(得分:0)
首先,这是存储数据的不好方法。最好的方法是数据库。但即使您使用文本文件,也可以使用更好的方法。因为文件包含空行,并且不同的行在逻辑上属于一起。所以你需要找到前几行中每个产品的日期。你可以将它添加到每一行,然后就更容易了。
但是,您可以使用以下使用LINQ和循环的代码:
Dim format = "dd MMMM yyyy"
Dim dateProducts As New List(Of Tuple(Of Date, String))
Dim lines = From line In File.ReadLines("ProductsSold.txt")
Where Not String.IsNullOrWhiteSpace(line)
Select line.Trim()
For Each line As String In lines
Dim currentDate As Date
Dim isDateline As Boolean = False
If line.Length >= format.Length AndAlso line.Contains(","c) Then
' try to extract the date...
Dim tokens = line.Split({","c}, StringSplitOptions.RemoveEmptyEntries)
isDateline = Date.TryParseExact(tokens.Last().Trim(), format, CultureInfo.InvariantCulture, DateTimeStyles.None, currentDate)
End If
If isDateline Then
dateProducts.Add(New Tuple(Of Date, String)(currentDate, Nothing))
ElseIf dateProducts.Count > 0 Then
' select date from last item and add this product
dateProducts.Add(New Tuple(Of Date, String)(dateProducts.Last().Item1, line))
Else
' otherwise invalid data, product without date, skip
End If
Next
现在您可以使用ToLookup
创建类似于字典的内容,关键是日期(没有时间),值是该日期的产品列表。字典的一个区别是,如果给定日期没有产品,则会得到一个空序列。
Dim dateLookup = dateProducts.
Where(Function(ds) ds.Item2 IsNot Nothing).
ToLookup(Function(ds) ds.Item1.Date)
Dim allProductsOfToday = dateLookup(Date.Today)
For Each dateProductInfo In allProductsOfToday
lstTodaysTrans.Items.Add(dateProductInfo.Item2) ' Item2 is the product
Next
我已经使用您的示例文件对其进行了测试,该文件不包含今天的产品,因此它不是最佳示例。如果您将其中一个日期从15 March 2015
更改为16 March 2015
,则会在ListBox
中看到相应的产品。