VB.NET读取文本文件中特定的文本

6
我希望我的程序能够读取文本文件中的某些文本。例如,如果我有一个包含以下信息的文本文件...
acc=blah
pass=hello

我希望我的vb.net应用程序能够获取到账户变量等于blah,密码变量等于hello。
有人能告诉我如何做吗?
谢谢。
8个回答

5

这是一个简短的代码段,点击按钮后将:

  1. 获取一个输入文件(在本例中,我创建了一个名为“test.ini”的文件)
  2. 将值作为单独的行读入
  3. 使用正则表达式搜索以查看它是否包含任何“ACC =”或“PASS =”参数
  4. 然后将它们写入控制台

以下是代码:

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

这段代码可以从文本文件中提取所需的参数。在指出解决方案存在问题时,点踩是有效的。但是应该给予反馈,以便为阅读发布的答案和回答者的人提供详细说明。 - Dostee
不用担心源代码的问题,我已经让它正常工作了。我只有一个问题:如何将 m.groups(1) 中的数据保存到一个变量中? - lab12
将console.writeline替换为一个占位符,例如您可以使用一个字符串数组-类似于:myArray(i) = "找到密码 {0}" & m2.Groups(1) & m2.Groups(1).Index - Dostee
以下是准确的错误信息:运算符“&”不能用于类型“String”和“System.Text.RegularExpressions.Group”。 - lab12
人- 你需要去享受圣诞节!哈哈- 好的,使用“+”(加号)运算符代替“&”。如果由于某种奇怪的原因它不起作用,你也可以使用string.concat()函数。例如,myArray = string.concat(m2.groups(1), m2.groups(1).index)。 - Dostee
哈哈,我已经在享受圣诞节了。但是,在string.concat函数中,它会显示单词后面的字符数。我该如何解决这个问题? - lab12

3

2
看起来您有一份INI文件......最好的读取方法是使用Windows API的*PrivateProfile*函数,这意味着您可以轻松地为任何需要创建一个正式的完整的INI文件。你可能会喜欢使用这里的包装器类。
Microsoft建议使用注册表来存储此类信息,并不鼓励使用INI文件。
如果您只想手动使用具有您所拥有的语法的文件,则只需将字符串分割为“=”并将结果放入字典中即可。记得处理在文件中未找到数据且您需要默认值或错误的情况。然而,在现代时代,XML正变得越来越受欢迎用于数据文本文件,有很多库用于从这些文件中加载。

1
我的建议是:你可以使用XML。如果你愿意将所有的文本文件转换成XML,.NET框架有很多好用的XML工具,这样会让生活变得更加容易。
也许不是你想要的,但这比使用纯文本(除非开发自己的解析器或使用低级API)更干净、更简单。

0
你有没有考虑让框架来处理它呢?
如果你在项目属性的设置选项卡中添加一个名为“acc”的条目,类型为字符串,作用域为用户(或应用程序,根据要求),值为“pass”,那么你就可以使用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方法在您需要的任何load事件中,并在关闭事件中调用SetSettings方法。
这将在application.exe.config文件中创建一个条目,可以在本地设置的\apps\2.0等目录,或漫游设置中找到。如果是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>

0

你不能只选择性地读取文件中的某个特定信息。你需要扫描文件的每一行,并在行首搜索字符串"pass="。我不懂VB,但可以查阅以下主题:

  1. 文件读取器(尤其是能够逐行读取的)
  2. 字符串分词/拆分(如Astander所提到的)
  3. 文件读取示例

0
编写自己的解析器并不难。我曾经为一个游戏制作了一个(使用C#,但VB似乎也有Regex类。使用它,你文件中的acc变量将是等于号之前的所有内容,然后blah将是等于号到换行符(\n)之间的所有内容。然后进入下一行并重复此过程。

0

我为你写了这个,请检查并享受结果,祝你有美好的一天!

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim acc As New List(Of String)
    Dim pass As New List(Of String)
    Dim lines() As String = System.IO.File.ReadAllLines(".\credentials.txt")
    For Each lineItem As String In lines
        Dim vals() As String = lineItem.Split(Convert.ToChar("="))
        If vals.Length > 0 Then
            Dim lineId As String = vals(0)
            If lineId = "acc" Then
                acc.Add(vals(1))
            ElseIf lineId = "pass" Then
                pass.Add(vals(1))
            End If
        End If
    Next
    TextBox_acc.Text = String.Join(Environment.NewLine, acc)
    TextBox_pass.Text = String.Join(Environment.NewLine, pass)
End Sub
End Class

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接