【问题标题】:VB.NET Read Certain text in a text fileVB.NET 读取文本文件中的某些文本
【发布时间】:2010-12-26 05:09:08
【问题描述】:

我希望我的程序读取文本文件中的某些文本。例如,如果我有一个包含以下信息的文本文件..

acc=blah
pass=hello

我希望我的 vb.net 应用程序获得帐户变量等于 blah,密码变量等于 hello。

谁能告诉我怎么做?

谢谢

【问题讨论】:

    标签: vb.net visual-studio-2008 file text


    【解决方案1】:

    看看这篇文章

    Reading and writing text files with VB.NET

    在逐行读取文件的过程中,可以使用String.Split Method,分割符为"=",将字符串分割成参数名,参数值。

    【讨论】:

      【解决方案2】:

      您不能真正选择性地读取文件中的某些信息。您必须扫描文件的每一行并在行首搜索字符串“pass=”。我不了解 VB,但请查看以下主题:

      1. 文件阅读器(尤其是一次只能读取一行的阅读器)
      2. 字符串分词器/拆分(如 Astander 所述)
      3. 文件读取示例

      【讨论】:

        【解决方案3】:

        我的建议:你使用 XML。 .NET 框架有很多很好的 XML 工具,如果你愿意将所有的文本文件转换成 XML,它会让生活变得更轻松。

        这可能不是您想要的,但它比使用纯文本(除了开发自己的解析器或使用较低级别的 API)所能做的任何事情都更简洁。

        【讨论】:

          【解决方案4】:

          看起来您有某种 INI 文件...阅读这些文件的最佳方法是使用 Windows API 的 *PrivateProfile* 函数,这意味着您实际上可以很容易地拥有一个适当的完整 INI 文件你需要的任何东西。有一个包装类 here 你可能会喜欢使用。

          Microsoft 建议您使用注册表来存储此类信息,并且不鼓励使用 INI 文件。

          如果您只想手动使用您拥有的语法文件,这是一个简单的案例,将字符串拆分为 '=' 并将结果放入字典中。请记住处理在文件中找不到数据并且您需要默认/错误的情况。然而,在现代,XML 在数据文本文件中变得越来越流行,并且有很多库可以处理从这些文件中加载。

          【讨论】:

            【解决方案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
            

            【讨论】:

            • 此代码用于从文本文件中提取所要求的参数。 Downvoting 可以有效地指出解决方案中的问题。但也应提供反馈,以便详细说明其他人阅读发布的答案以及回答者的利益。
            • Nvm。关于源代码..我让它工作。我只有一个问题。如何将数据从 m.groups(1).... 程序写入数据的位置保存到变量中?
            • 将 console.writeline 替换为持有者,例如,您可以使用字符串数组 - 类似:myArray(i) = "Found password {0}" & m2.Groups(1) & m2 .Groups(1).Index
            • 这里是确切的错误:运算符 '&' 没有为类型 'String' 和 'System.Text.RegularExpressions.Group' 定义
            • Man- 你需要去享受圣诞节!哈哈-使用'+'(加号)运算符而不是'&'。如果由于某些奇怪的原因不起作用,您也可以使用 string.concat() 函数。比如,myArray = string.concat(m2.groups(1), m2.groups(1).index)
            【解决方案6】:

            您是否考虑过让框架来处理它?

            如果您在项目属性的设置选项卡中添加一个条目,名称为 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>
            

            【讨论】:

              【解决方案7】:

              编写自己的解析器并不难。我设法为游戏制作了一个(使用 C#,但 VB 似乎也有 Regex 类。使用它,文件中的 acc 变量将是 = 符号之前的所有内容,然后是 blah将是从 = 到换行符 (\n) 的所有内容,然后转到下一行并重复。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-01-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-02
                • 2016-10-19
                相关资源
                最近更新 更多