【问题标题】:VB import value from textVB从文本导入值
【发布时间】:2018-10-01 17:12:33
【问题描述】:

假设我有一个简单的三行文本文件,例如:

FirstName=Adam
LastName=Smith
Age=25 

但是有更多的文件具有不同的值和/或被打乱的姓氏是第一个,名字是第二个等等。所以应用程序不能依赖于行号,而是从文本中读取单词。

我希望该应用程序进入文件,检测 Adam 是名字,Smith 是姓氏,年龄是 25 岁并将其输出为字符串,然后导入并立即分配给适当的应用程序内变量( LastName=Smith 被分配给 App 等中的 LastName 变量。

我希望你能理解我.. 这很难解释 :-)。如果你不能得到我真正想要的,我可以尝试提供进一步的解释。

提前致谢

【问题讨论】:

  • 请阅读how to ask 以及如何添加您尝试过的complete and verifiable 示例。还包括所需的结果。
  • 我不确定您到底想做什么,但我会先将数据放入字典或适当的类中。弄清楚那部分后,您可以查看系统中的导入。
  • 你知道如何打开文件并阅读吗?如果不搜索并尝试一些代码。如果您的代码失败,请告诉我们您遇到了什么错误或错误结果。
  • 是的,我知道如何使用 My.Computer.FileSystem.Readalltext 或 StreamReader 作为一个整体打开和读取文件,但是我不知道如何获取该文本的确切分区 - 所以它读取文本文件,检测到 First Name 是 Adam 并将其作为 FirstName 等于 Adam 导入到应用程序中,与 LastName=Smith 等相同。我不希望它被预定义我想要可以读取和存储数据的应用程序和我完全不知道应该使用什么命令,也不知道 Collection、Classes 或 Dictionaries 如何帮助我。
  • SO 不是代码编写服务。如果您需要有人为您编写应用程序,可以为此目的提供付费服务。如果您坚持自己做,但您不了解如何创建一个简单的算法,那么对于问答形式来说,这个话题太宽泛了。

标签: vb.net text-files text-parsing


【解决方案1】:

您需要使用一些字符串函数。你需要的是SubstringIndexOfSubstring 用于获取字符串的某一部分。 IndexOf 用于获取字符串中某个部分的位置。所以你需要得到等号的位置,然后将等号前后的字符串分开。等号前面是属性名,等号后面是属性值。

Sub Main

    Dim firstName As String = "", lastName As String = "", age As Integer
    For Each line In File.ReadLines("C:\input.txt")
        Dim equalSignIndex = line.IndexOf("=")
        Dim propertyName = line.Substring(0, equalSignIndex)
        Dim propertyValue = line.Substring(equalSignIndex + 1, line.Length - equalSignIndex - 1)
        Select Case propertyName
            Case "FirstName" :
                firstName = propertyValue
            Case "LastName" :
                lastName = propertyValue
            Case "Age" :
                age = propertyValue
        End Select
    Next
    Console.WriteLine("Name = {0} {1}, Age = {2}", firstName, lastName, age)

End Sub

【讨论】:

    【解决方案2】:

    这是另一个可能的答案,使用可能合适的line.Split。我考虑到你的文本文件的格式可能有点乱,所以我做了一个文本文件input.txt 作为测试,它的内容是这样的:

    FirstName=Adam
    LastName=Smith
    Age=25 
    lastName=Smith2
    FirstName=Adam2
    Age=35 
    age=45 
    
    Firstname=Adam3
    LastName=Smith3
    firstname=Adam4
    LastName=Smith4
    Age=55 
    
    FirstName=Adam5
    LastName=Smith5
    Age=65
    

    如您所见,我故意把一些东西放在错误的顺序上,添加了换行符,并且为了很好的衡量,还弄乱了字符大小写。

    代码:

        Dim firstName As String = String.Empty, lastName As String = String.Empty, age As Integer = 0
    
        For Each line In File.ReadLines("C:\input.txt")
            If line.Contains("=") Then
                Dim TxtSplit() As String = line.Split("="c)
                Select Case TxtSplit(0).ToLower
                    Case "firstname" : firstName = TxtSplit(1)
                    Case "lastname" : lastName = TxtSplit(1)
                    Case "age" : age = Integer.Parse(TxtSplit(1))
                End Select
            End If
    
            If Not String.IsNullOrEmpty(firstName) AndAlso Not String.IsNullOrEmpty(lastName) AndAlso Not age = 0 Then
                Console.WriteLine("Name: {0} {1}, Age: {2}", firstName, lastName, age)
                firstName = String.Empty : lastName = String.Empty : age = 0
            End If
        Next
    

    FirstName、LastName、Age 仅在每个都有其值后才会打印到控制台。所以它将通过检查,写入控制台,然后变量将重置为下一组三个。希望对您有所帮助。

    上面的控制台输出:

    Name: Adam Smith, Age: 25
    Name: Adam2 Smith2, Age: 35
    Name: Adam3 Smith3, Age: 45
    Name: Adam4 Smith4, Age: 55
    Name: Adam5 Smith5, Age: 65
    

    【讨论】:

    • 谢谢你们!终于有人真正理解了我想说的话:)。回家后一定要试试。
    • 是的!在多种情况下尝试过,总是有效:)现在我想在数组上尝试它,所以你有类似 Qualifications {job1;job2;job3..} .. 获得多个不同的输出.. 这是我对未来的愿景:D .不管怎样,谢谢你的帮助:)
    • 很高兴知道它有效。为什么不将我的答案标记为已回答?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 2015-11-09
    • 2010-10-13
    • 1970-01-01
    相关资源
    最近更新 更多