【发布时间】:2010-12-26 05:09:08
【问题描述】:
我希望我的程序读取文本文件中的某些文本。例如,如果我有一个包含以下信息的文本文件..
acc=blah
pass=hello
我希望我的 vb.net 应用程序获得帐户变量等于 blah,密码变量等于 hello。
谁能告诉我怎么做?
谢谢
【问题讨论】:
标签: vb.net visual-studio-2008 file text
我希望我的程序读取文本文件中的某些文本。例如,如果我有一个包含以下信息的文本文件..
acc=blah
pass=hello
我希望我的 vb.net 应用程序获得帐户变量等于 blah,密码变量等于 hello。
谁能告诉我怎么做?
谢谢
【问题讨论】:
标签: vb.net visual-studio-2008 file text
看看这篇文章
Reading and writing text files with VB.NET
在逐行读取文件的过程中,可以使用String.Split Method,分割符为"=",将字符串分割成参数名,参数值。
【讨论】:
您不能真正选择性地读取文件中的某些信息。您必须扫描文件的每一行并在行首搜索字符串“pass=”。我不了解 VB,但请查看以下主题:
【讨论】:
我的建议:你使用 XML。 .NET 框架有很多很好的 XML 工具,如果你愿意将所有的文本文件转换成 XML,它会让生活变得更轻松。
这可能不是您想要的,但它比使用纯文本(除了开发自己的解析器或使用较低级别的 API)所能做的任何事情都更简洁。
【讨论】:
看起来您有某种 INI 文件...阅读这些文件的最佳方法是使用 Windows API 的 *PrivateProfile* 函数,这意味着您实际上可以很容易地拥有一个适当的完整 INI 文件你需要的任何东西。有一个包装类 here 你可能会喜欢使用。
Microsoft 建议您使用注册表来存储此类信息,并且不鼓励使用 INI 文件。
如果您只想手动使用您拥有的语法文件,这是一个简单的案例,将字符串拆分为 '=' 并将结果放入字典中。请记住处理在文件中找不到数据并且您需要默认/错误的情况。然而,在现代,XML 在数据文本文件中变得越来越流行,并且有很多库可以处理从这些文件中加载。
【讨论】:
这里有一小段代码,当你点击一个按钮后,它会:
代码如下:
Imports System.IO
Imports System.Text.RegularExpressions
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim strFile As String = "Test.INI"
Dim sr As New StreamReader(strFile)
Dim InputString As String
While sr.Peek <> -1
InputString = sr.ReadLine()
checkIfContains(InputString)
InputString = String.Empty
End While
sr.Close()
End Sub
Private Sub checkIfContains(ByVal inputString As String)
Dim outputFile As String = "testOutput.txt"
Dim m As Match
Dim m2 As Match
Dim itemPattern As String = "acc=(\S+)"
Dim itemPattern2 As String = "pass=(\S+)"
m = Regex.Match(inputString, itemPattern, _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)
m2 = Regex.Match(inputString, itemPattern2, _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)
Do While m.Success
Console.WriteLine("Found account {0}", _
m.Groups(1), m.Groups(1).Index)
m = m.NextMatch()
Loop
Do While m2.Success
Console.WriteLine("Found password {0}", _
m2.Groups(1), m2.Groups(1).Index)
m2 = m2.NextMatch()
Loop
End Sub
End Class
【讨论】:
您是否考虑过让框架来处理它?
如果您在项目属性的设置选项卡中添加一个条目,名称为 acc、类型字符串、范围用户(或应用程序,取决于要求)和值传递,您可以使用 System.Configuration.ApplicationSettingsBase 功能来处理它。
Private _settings As My.MySettings
Private _acc as String
Private _pass as String
Public ReadOnly Property Settings() As System.Configuration.ApplicationSettingsBase
Get
If _settings Is Nothing Then
_settings = New My.MySettings
End If
Return _settings
End Get
End Property
Private Sub SetSettings()
Settings.SettingsKey = Me.Name
Dim theSettings As My.MySettings
theSettings = DirectCast(Settings, My.MySettings)
theSettings.acc=_acc
theSettings.pass=_pass
Settings.Save()
End Sub
Private Sub GetSettings()
Settings.SettingsKey = Me.Name
Dim theSettings As My.MySettings
theSettings = DirectCast(Settings, My.MySettings)
_acc=theSettings.acc
_pass=theSettings.pass
End Sub
在您需要的任何加载事件中调用 GetSettings,在关闭事件中调用 SetSettings
这将在 application.exe.config 文件中创建一个条目,或者在本地设置 \apps\2.0\etc 等目录中,或者在您的漫游目录中,或者如果它是 clickonce 部署,则在 clickonce 数据目录中。这将如下所示:-
<userSettings>
<MyTestApp.My.MySettings>
<setting name="acc" serializeAs="String">
<value>blah</value>
</setting>
<setting name="pass" serializeAs="String">
<value>hello</value>
</setting>
</MyTestApp.My.MySettings>
</userSettings>
【讨论】:
编写自己的解析器并不难。我设法为游戏制作了一个(使用 C#,但 VB 似乎也有 Regex 类。使用它,文件中的 acc 变量将是 = 符号之前的所有内容,然后是 blah将是从 = 到换行符 (\n) 的所有内容,然后转到下一行并重复。
【讨论】: