Skip block of text from adding to dictionary vb.net

浪尽此生 提交于 2020-12-15 06:24:52

问题


I want to know if there is a way to read a text file that lets say has content like so:

Store - 001P 
Owner - Greg 
Price - 45000 
Employees - 30 

Store - 002
Owner- Jen 
Price - 34400 

Now lets say I only want to work with the store information in the block where the store number contains a P. Is there a way to read the text file to check for the P after the delimiter, and then skip to the next instance of "store" in the text file? I tried to find which function is best as in different languages you can GoTo function, but I cannot find anything on this.

This is a snippet of my current code:

Dim columnV As New Dictionary(Of String, Integer)   
    Dim descriptionV As String
    Dim quantityV As Integer

    For Each totalLine As String In MyData
    descriptionV  = Split(totalLine, "-")(0)
    quantityV = Split(totalLine, "-")(1)
        If columnV.ContainsKey(descriptionV) Then
            columnV(descriptionV) = colSums(descriptionV) + quantityV
        Else
            columnV.Add(descriptionV, quantityV)
        End If
    'Next

回答1:


Ok, if I read this correct, you only want to worry about and process stores that end in a "P". Did I get that right?

and your data is like this then:

Store - 001P \n Owner - Greg \n Price - 45000 \n Employees - 30 \n
Store - 002\n Owner- Jen \n Price - 34400 \n

So in code we could go:

dim store as string
dim Owner as string
dim Price as decimal
dim employees as integer

' your code to read the data 

now we have the process loop

For Each totalLine As String In MyData

    store = trim(split(split(totalLine,"\n)(0),"-")(1))
    Owner = trim(split(split(totalLine,"\n)(1),"-")(1))
    Price = trim(split(split(totalLine,"\n")(3),"-")(1))
    Employees = trim(split(split(totalLine,"\n")(4),"-")(1))

    if strings.right(store,1) = "P" then 
       ' our process code
       If columnV.ContainsKey(store) Then
    end if

    Next

So you can use Strings.Right(some text,1) to get the right most character. You simply then have a if/then block around that code, and thus you skip anything that does not have a store with "P" as the last letter. The above is air code, but the simple concept here is to first: Split out the line into the correct parts.

Check if store ends in "P" with the above if/then, and thus only stores ending in P will be processed.

However, your sample code and the variable names used really does not make a lot of sense.




回答2:


It appears as if a record can be represented across multiple lines, but not a defined number of multiple lines (e.g. 001P is over 4 lines but 002 is over 3 lines).

It also appears as if the line represents the data in a {property} - {value} format.

The first thing that I would do is create a class to represent your record.

The second thing would be to get every line from your text file and iterate over them.

The third thing would be take the incoming information and convert it to your custom class which would be added to a List.

The last thing would be to then filter the List where Stores do not contain the letter "P".

Here is the code, in action:

Imports System
Imports System.Collections.Generic
Imports System.Linq
Public Module Module1
    Public Sub Main()
        IO.File.WriteAllLines("test.txt", {
                "Store - 001P",
                "Owner - Greg",
                "Price - 45000",
                "Employees - 30",
                "Store - 002",
                "Owner - Jen",
                "Price - 34400"
                })
        
        Dim lines() As String = IO.File.ReadAllLines("test.txt")
        Dim stores As List(Of Store) = ConvertLinesToStores(lines)
        Dim storesWithP() As Store = stores.Where(Function(s) s.StoreId.Contains("P")).ToArray()

        Console.WriteLine("Stores with P: ")
        Console.WriteLine(String.Join(Environment.NewLine, storesWithP.Select(Function(s) s.StoreId).ToArray()))
    End Sub

    Private Function ConvertLinesToStores(ByVal lines() As String) As List(Of Store)
        Dim stores As New List(Of Store)
        Dim item As Store
        For Each line As String In lines
            Dim parts() As String = line.Split(" - ")
            If (lines.Length < 3) Then
                Continue For
            End If

            Dim propertyName As String = parts(0)
            Dim propertyValue As String = parts(2)
            Dim employeeCount As Integer
            If (propertyName = "Store") Then
                If (item IsNot Nothing) Then
                    stores.Add(item)
                End If
                item = New Store() With {.StoreId = propertyValue}
            ElseIf (propertyName = "Owner") Then
                item.Owner = propertyValue
            ElseIf (propertyName = "Price") Then
                item.Price = propertyValue
            ElseIf (propertyName = "Employees" AndAlso Integer.TryParse(propertyValue, employeeCount)) Then
                item.EmployeeCount = employeeCount
            End If
        Next

        If (item IsNot Nothing) Then
            stores.Add(item)
        End If

        Return stores
    End Function
End Module

Public Class Store
    Public Property StoreId As String
    Public Property Owner As String
    Public Property Price As Integer
    Public Property EmployeeCount As Integer
End Class

Fiddle: Live Demo




回答3:


Assuming your text file has a consistent pattern the following will give you a list of your stores with all the properties. My Stores.txt looks like this...

Store - 001P 
Owner - Greg 
Price - 45000 
Employees - 30 

Store - 002
Owner- Jen 
Price - 34400 
Employees - 20

Store - 03P
Owner - Mary
Price - 50000
Employees - 22

Store - 04P
Owner - Bill
Price - 42000
Employees - 90

I created a simple class to hold the store data.

Public Class Store
    Public Property ID As String
    Public Property Owner As String
    Public Property Price As Decimal
    Public Property Employees As Integer
End Class

First I read the file getting an array of lines. I loop through the lines of the file skipping ahead by 5 on each iteration (Step 5).This should hit the Store line (Store appears every 5 lines).

If it contains a P then I create a new Store and set it properties by moving down one line (the i + 1 etc.). After the properties are set, I add the Store to the list.

Now you have a List(Of Store) containing only the stores who's Id contains a P. You can access the items by index or in a For Each loop and have all the properties available.

Private StoreList As New List(Of Store)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim lines = File.ReadAllLines("C:\Users\maryo\Desktop\Stores.txt")
    For i = 0 To lines.Length - 4 Step 5
        Dim ID = lines(i).Split("-"c)(1).Trim
        If ID.Contains("P") Then
            Dim st As New Store
            st.ID = ID
            st.Owner = lines(i + 1).Split("-"c)(1).Trim
            st.Price = CDec(lines(i + 2).Split("-"c)(1).Trim)
            st.Employees = CInt(lines(i + 3).Split("-"c)(1).Trim)
            StoreList.Add(st)
        End If
    Next
    'Just to check if my list contains what I expected.
    DataGridView1.DataSource = StoreList
End Sub


来源:https://stackoverflow.com/questions/64135770/skip-block-of-text-from-adding-to-dictionary-vb-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!