在vb.net中,我的文本文件行有时包含相同的字符串

在vb.net中,我的文本文件行有时包含相同的字符串,vb.net,text-files,Vb.net,Text Files,我有一个文本文件,它在不同的行中包含相同的字符串。我使用以下代码读取文件: Dim readTexte() As String = File.ReadAllLines(OuvrirFichier, Encoding.UTF8) Dim t As String For Each t In readTexte If t.Contains(TreeView1.SelectedNode.Text) Then TextBox2.Text = Trim(t.Substring(0,

我有一个文本文件,它在不同的行中包含相同的字符串。我使用以下代码读取文件:

Dim readTexte() As String = File.ReadAllLines(OuvrirFichier, Encoding.UTF8)
Dim t As String
For Each t In readTexte
    If t.Contains(TreeView1.SelectedNode.Text) Then
        TextBox2.Text = Trim(t.Substring(0, 18))
        TextBox1.Text = Trim(t.Substring(18, 90))
        TextBox4.Text = Trim(t.Substring(107, 120))
    End If
Next
然而,我有一个问题,因为当剪切和读取这些字符串时。代码无法选择与TreeView节点匹配的正确行,因为它标识了几个同样完美的字符串

例如,第一行包含3个子字符串(固定宽度字段):

圣徒、奥古斯丁和教会医生

第二行也包含三个子字符串,略有不同:

圣人,莫妮卡,圣奥古斯丁的母亲

当我想读的时候,我的密码给了我两个奥古斯丁,混合了奥古斯丁和莫妮克!TextBox2包含树视图中包含的字符串

我怎样才能解决这个问题

树视图的创建尽可能简单,因此:

Dim readText () As String = File.ReadAllLines (OpenFile,
Encoding.UTF8)
              Dim s As String
              For Each s In readText
                  TextBox2.Text = Trim (s.Substring (0, 18))
                  TextBox1.Text = Trim (s.Substring (18, 90))
                  TextBox4.Text = Trim (s.Substring (107, 120))
                  Dim node As TreeNode = Me.TreeView1.Nodes (0)
                  TreeView1.Nodes (0) .Nodes.Add (New TreeNode (TextBox1.Text))
              Next

在回答这个问题之前,我们需要更多地了解TreeView是如何构建的。现在可能没有足够的数据与TreeView关联,解决方案将位于完全不同的代码区域

但是,我可以提供一些注释。首先,在计算机中读取文件是最慢的事情之一。我们已经看到它足够小,可以放在内存中;如果它也相当稳定(不经常更改),则可以在程序启动时加载到数组一次,从而节省大量工作

接下来,我不会只保留一个简单的字符串数组。相反,我会在加载时将数据解析为单独的字段。元组、类甚至字符串数组都可以工作

最后,即使在找到匹配项后,此代码仍将继续循环。一旦找到我们要找的东西,我就有办法停下来

把它们放在一起,就像这样:

'Create a set of Tuples. Could also use a class here.
Dim readTexte() As IEnumerable(Of (String, String, String)) = 
    File.ReadLines(OuvrirFichier, Encoding.UTF8).
        Select(Function(line) (Trim(line.SubString(0, 18)), Trim(line.SubString(18,90)), Trim(line.SubString(107,120))) )
             

'Search the collection for the first match             
Dim result = readTexte.First(Function(record) TreeView1.SelectedNode.Text.Equals(record.Item1))
TextBox2.Text = result.Item1
TextBox1.Text = result.Item2
TextBox4.Text = result.Item3

同样,这并不能解决匹配问题,因为该问题不包含我们需要帮助完成匹配的信息。请编辑该问题,以包含有关如何创建TreeView的更多详细信息。

您可以尝试在逗号上拆分,然后查看数组中是否有任何项与您的节点匹配。只是猜测一下,因为我们不知道你的数据的一致性。@LarsTech,这是我的错。我一开始误读了这个问题,编辑得不好(现在好多了)。但是预先解析东西的想法已经过时了,代码是基于结构化和文本文件的。我在库中输入UTF8编码文件中的数据。Dim result=readText.First(函数(记录)TreeView1.SelectedNode.Text=record.Item1)TextBox2.Text=result.Item1 TextBox1.Text=result.Item2 TextBox4.Text=result.Item3这会引发一个错误:“Item1”不是“IEnumerable(of(of(String,String,String))的成员)“.
result
应该是一个带字符串的元组,但不知怎么的,它被当作IEnumerable来提取。你有选项严格和选项推断吗?您可能丢失了使用指令的
,看到的是此消息而不是正确的消息,因为在选项Strict上的错误决定
选项Strict设置为Off,但如果我将其设置为on,则会出现100个错误很好,那么它正在做它的工作;(最好在项目级别启用该选项)。当
选项严格限制在
上时,它将隐式数据类型转换限制为仅扩大转换、不允许后期绑定以及不允许导致对象类型的隐式类型。您应该花时间修复这些错误!每一个都有可能使您的程序在运行时中断。@claudebl我这里有一个它的演示: