VB.NET-从文本文件加载值列表

VB.NET-从文本文件加载值列表,vb.net,Vb.net,我有一个如下所示的文本文件: [第一组] 价值1 价值2 价值3 [第2组] 价值1 价值2 [第3组] 价值3 价值4 等 我希望能够做的是根据传入的组值将值加载到数组(或列表?)中。如果我传入“group2”,那么它将返回“value1”和“value2”的列表 此外,这些值不会经常更改(可能每6个月左右更改一次),因此是否有更好的方法来存储它们,而不是使用普通的旧文本文件,以便更快地加载等 谢谢你的帮助 莱多这是一个家庭作业问题 使用StreamReader类读取文件(您可能需要使用.En

我有一个如下所示的文本文件:

[第一组] 价值1 价值2 价值3

[第2组] 价值1 价值2

[第3组] 价值3 价值4

我希望能够做的是根据传入的组值将值加载到数组(或列表?)中。如果我传入“group2”,那么它将返回“value1”和“value2”的列表

此外,这些值不会经常更改(可能每6个月左右更改一次),因此是否有更好的方法来存储它们,而不是使用普通的旧文本文件,以便更快地加载等

谢谢你的帮助


莱多这是一个家庭作业问题

使用StreamReader类读取文件(您可能需要使用.EndOfStream和ReadLine()),并使用String类进行字符串操作(可能是.StartsWith()、.Substring()和.Split()

至于更好的存储方式,则“视情况而定”。您将拥有多少组、有多少个值、访问数据的频率等。问题的原始措辞可能会让我们更好地了解他们听到的内容

添加:

因此,假设这个程序/服务整天都在运行,并且文件不是很大,那么您可能只想将文件读入一次字典(字符串的,列表(字符串的))。该方法的ContainsKey方法将确定是否存在一个组

   Function GetValueSet(ByVal filename As String) As Dictionary(Of String, List(Of String))
        Dim valueSet = New Dictionary(Of String, List(Of String))()
        Dim lines = System.IO.File.ReadAllLines(filename)
        Dim header As String
        Dim values As List(Of String) = Nothing
        For Each line As String In lines
            If line.StartsWith("[") Then
                If Not values Is Nothing Then
                    valueSet.add(header, values)
                End If
                header = GetHeader(line)
                values = New List(Of String)()
            ElseIf Not values Is Nothing Then
                Dim value As String = line.Trim()
                If value <> "" Then
                    values.Add(value)
                End If
            End If
        Next
        If Not values Is Nothing Then
            valueSet.add(header, values)
        End If
        Return valueSet
    End Function

    Function GetHeader(ByVal line As String)
        Dim index As Integer = line.IndexOf("]")
        Return line.Substring(1, index - 1)
    End Function
函数GetValueSet(ByVal文件名为字符串)作为字典(字符串的),列表(字符串的))
Dim valueSet=新字典(字符串),列表(字符串))()
Dim lines=System.IO.File.ReadAllLines(文件名)
将标题设置为字符串
按列表(字符串的)调整值=无
将每一行作为行中的字符串
如果line.StartsWith(“[”)则
如果不是,那么值就是零
valueSet.add(标题、值)
如果结束
header=GetHeader(行)
值=新列表(字符串)()
否则,如果没有价值,那么什么都不是
尺寸值为String=line.Trim()
如果值为“”,则
值。添加(值)
如果结束
如果结束
下一个
如果不是,那么值就是零
valueSet.add(标题、值)
如果结束
返回值集
端函数
函数GetHeader(ByVal行作为字符串)
作为整数的Dim索引=line.IndexOf(“]”)
返回行。子字符串(1,索引-1)
端函数
添加:

现在,如果您运行的是多线程解决方案(包括所有ASP.Net解决方案),那么您要么希望确保在应用程序启动时执行此操作(对于Global.asax中的ASP.Net,我认为是ApplicationStart或OnStart之类的),要么需要锁定。WinForms和服务默认情况下不是多线程的


此外,如果文件发生更改,您需要重新启动应用程序/服务/网站,或者需要添加文件监视程序来重新加载数据(然后多线程将需要锁定,因为这不再局限于应用程序启动)。

这是一个家庭作业问题

使用StreamReader类读取文件(您可能需要使用.EndOfStream和ReadLine()),并使用String类进行字符串操作(可能是.StartsWith()、.Substring()和.Split()

至于更好的存储方式,则“视情况而定”。您将拥有多少组、有多少个值、访问数据的频率等。问题的原始措辞可能会让我们更好地了解他们听到的内容

添加:

因此,假设这个程序/服务整天都在运行,并且文件不是很大,那么您可能只想将文件读入一次字典(字符串的,列表(字符串的))。该方法的ContainsKey方法将确定是否存在一个组

   Function GetValueSet(ByVal filename As String) As Dictionary(Of String, List(Of String))
        Dim valueSet = New Dictionary(Of String, List(Of String))()
        Dim lines = System.IO.File.ReadAllLines(filename)
        Dim header As String
        Dim values As List(Of String) = Nothing
        For Each line As String In lines
            If line.StartsWith("[") Then
                If Not values Is Nothing Then
                    valueSet.add(header, values)
                End If
                header = GetHeader(line)
                values = New List(Of String)()
            ElseIf Not values Is Nothing Then
                Dim value As String = line.Trim()
                If value <> "" Then
                    values.Add(value)
                End If
            End If
        Next
        If Not values Is Nothing Then
            valueSet.add(header, values)
        End If
        Return valueSet
    End Function

    Function GetHeader(ByVal line As String)
        Dim index As Integer = line.IndexOf("]")
        Return line.Substring(1, index - 1)
    End Function
函数GetValueSet(ByVal文件名为字符串)作为字典(字符串的),列表(字符串的))
Dim valueSet=新字典(字符串),列表(字符串))()
Dim lines=System.IO.File.ReadAllLines(文件名)
将标题设置为字符串
按列表(字符串的)调整值=无
将每一行作为行中的字符串
如果line.StartsWith(“[”)则
如果不是,那么值就是零
valueSet.add(标题、值)
如果结束
header=GetHeader(行)
值=新列表(字符串)()
否则,如果没有价值,那么什么都不是
尺寸值为String=line.Trim()
如果值为“”,则
值。添加(值)
如果结束
如果结束
下一个
如果不是,那么值就是零
valueSet.add(标题、值)
如果结束
返回值集
端函数
函数GetHeader(ByVal行作为字符串)
作为整数的Dim索引=line.IndexOf(“]”)
返回行。子字符串(1,索引-1)
端函数
添加:

现在,如果您运行的是多线程解决方案(包括所有ASP.Net解决方案),那么您要么希望确保在应用程序启动时执行此操作(对于Global.asax中的ASP.Net,我认为是ApplicationStart或OnStart之类的),要么需要锁定。WinForms和服务默认情况下不是多线程的


此外,如果文件发生更改,您需要重新启动应用程序/服务/网站,或者您需要添加一个文件监视程序来重新加载数据(然后多线程将需要锁定,因为这不再局限于应用程序启动)。

好的,下面是我编写的代码:

   Public Function FillFromFile(ByVal vFileName As String, ByVal vGroupName As String) As List(Of String)
        ' open the file
        ' read the entire file into memory
        ' find the starting group name
        Dim blnFoundHeading As Boolean = False
        Dim lstValues As New List(Of String)

        Dim lines() As String = IO.File.ReadAllLines(vFileName)
        For Each line As String In lines
            If line.ToLower.Contains("[" & vGroupName.ToLower & "]") Then
                ' found the heading, now start loading the lines into the list until the next heading
                blnFoundHeading = True
            ElseIf line.Contains("[") Then
                If blnFoundHeading Then
                    ' we are at the end so exit the loop
                    Exit For
                Else
                    ' its another group so keep going

                End If
            Else
                If blnFoundHeading And line.Trim.Length > 0 Then
                    lstValues.Add(line.Trim)
                End If
            End If
        Next

        Return lstValues

    End Function

好的,下面是我所做的编码:

   Public Function FillFromFile(ByVal vFileName As String, ByVal vGroupName As String) As List(Of String)
        ' open the file
        ' read the entire file into memory
        ' find the starting group name
        Dim blnFoundHeading As Boolean = False
        Dim lstValues As New List(Of String)

        Dim lines() As String = IO.File.ReadAllLines(vFileName)
        For Each line As String In lines
            If line.ToLower.Contains("[" & vGroupName.ToLower & "]") Then
                ' found the heading, now start loading the lines into the list until the next heading
                blnFoundHeading = True
            ElseIf line.Contains("[") Then
                If blnFoundHeading Then
                    ' we are at the end so exit the loop
                    Exit For
                Else
                    ' its another group so keep going

                End If
            Else
                If blnFoundHeading And line.Trim.Length > 0 Then
                    lstValues.Add(line.Trim)
                End If
            End If
        Next

        Return lstValues

    End Function

关于一种可能更好的存储数据的方法:您可能会发现XML很有用。将XML数据读入DataTable对象非常容易

例如:

Dim dtTest                        As New System.Data.DataTable
dtTest.ReadXml("YourFilePathNameGoesHere.xml")