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