在文本文件中搜索日期

时间:2015-03-16 09:34:34

标签: vb.net date listbox text-files

我创建了一个文本文件,其中包含在该日期购买的日期和产品。我想在单击按钮时读取文件,并且仅在当前日期(今天的日期)将产品返回到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

2 个答案:

答案 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中看到相应的产品。