【问题标题】:How can I get specific items from text file? Visual Basic 2010如何从文本文件中获取特定项目?视觉基础 2010
【发布时间】:2013-07-24 03:20:00
【问题描述】:

我试图弄清楚如何让消息框仅显示文本文件中的特定单词,该文本文件包含字典中的所有单词。我尝试了各种不同的方法,但无法让它发挥作用,但我确实认为我在正确的轨道上,所以只需要一些指针。

基本上,有一个打乱的字符串,每次都不一样,并且包含在一个标签中。我希望程序只显示包含加扰字符串中的字母的单词,但不知道如何实现?

这是我目前的代码:

Private Sub btnAnswers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnswers.Click

    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String
    Dim OneCharacter As String
    Dim Found As Boolean
    Dim item As String
    Dim AllCharacters As String

    Found = False
    Letters = lblLetters.Text

    For i = 0 To Letters.Length - 1
        OneCharacter = Letters.Substring(i, 1)
        For Each item In hash
            If item.Contains(OneCharacter) Then
                Found = True
                AllCharacters = OneCharacter
            Else
                Found = False
            End If
            MsgBox(item)
        Next
    Next i
End Sub

消息框确实显示了字典中的单词,但是单词可以包含标签字符串中不存在的字母,所以我的代码是错误的。任何人都可以帮忙吗?抱歉,但我是编程新手。

【问题讨论】:

  • 您需要在外部循环中遍历所有单词(hash),然后在内部嵌套循环中针对所有搜索字母评估当前单词。

标签: vb.net loops text-files


【解决方案1】:

通过对上一个答案的简单修改,您可以将输出限制为仅包含仅包含打乱字母的单词:

Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim word As String = item.ToLower()
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As Char = Char.ToLower(Letters(i))
            While word.Contains(OneCharacter)
                word = word.Remove(word.IndexOf(OneCharacter), 1)
            End While
        Next
        If (word.Length = 0) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub

使用此代码,如果加扰的字母包含“bok”,那么“book”将被选中。但是,删除 while 循环并仅保留 remove 语句,将确保只有每个不同字母的确切数字会匹配。所以需要'obok'来匹配“book”。

【讨论】:

  • 不仅仅是删除,我认为她想要的只是从字典中选择所有字符都包含在标签中的单词,即:如果标签是“字典”,“字典”就可以了(或“字典”)。这是我至少理解的。我认为我提供的帮助已经绰绰有余,因此不会改变我的回答:一切为了你。
  • 根据 OP 所说,如果标签是“dictionar”,她不想要“dictionaries”,因为 'e' 和 's' 不在原始字符串中。
  • 没错。您的代码正在提供功能但会激发它而不是检索现有条目。我认为她想要的是在文本文件中找到“字典”,如果没有,则不会返回任何内容。但是请看……这不是我的问题:问问她她到底在追求什么。
  • 它确实检索了现有项目。如果字符串足够短并且可以找到多个与该字符串匹配的条目,则无法确定哪个条目是正确的。没有人说这是你的问题。我只对我的答案中的代码基础给予了赞扬。
  • 谢谢@tinstaafl。如果我的描述不清楚,我很抱歉。标签字符串的一个示例可能是 CYUIALT,该标签中的一个单词可能是“CAT”(例如),这是文本文件中的一个单词,称为“字典”,正如我所说,文本文件包含所有字典中的单词。我希望程序检查输入的单词是否包含可以在标签字符串中找到的字母。
【解决方案2】:

正如 Steven Doggart 所建议的,您必须反转循环嵌套。您想要的是浏览所有字典条目,并为每个条目检查它是否包含字符串中的所有字母。您的循环结构不允许这样做。

我已在您的代码中执行了所需的更新。请记住,此代码忽略了大写字母(“A”与“a”相同)。

Private Sub btnAnswers_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim hash As List(Of String) = New List(Of String)(System.IO.File.ReadAllLines("C:\Users\Katie\Documents\Project\dictionary.txt"))
    Dim Letters As String = lblLetters.Text
    For Each item As String In hash
        Dim Found As Boolean = True
        For i = 0 To Letters.Length - 1
            Dim OneCharacter As String = Letters.Substring(i, 1)
            Dim itemToLower As String = item.ToLower()
            If Not itemToLower.Contains(OneCharacter.ToLower()) Then
                Found = False
                Exit For
            End If
        Next i
        If (Found) Then
            'The given dictionary entry includes all the letters in the label. No more iterations will be performed
            MsgBox(item)
            Exit For
        End If
    Next
End Sub

此代码查找包含给定标签中所有字符的键(不是相反),即:带有标签“dict”,“dictentry”是正确的。

在任何情况下,我的回答的重点不是提供您必须执行的代码;这段代码的重点是帮助您了解您做错了什么以及如何开始正确地做事。如果您对这个确切的功能不感兴趣,您必须编辑我的代码,以便可以完成您想要的;或者,理想情况下,您将完全从头开始编写自己的代码。

【讨论】:

  • 这仍然会显示包含标签字符串中不存在的字母的单词:(
  • @Katie 具有讽刺意味的是,我现在正在为您写评论。我观察到,自从你来到这里以来,你没有给出一个问题。老实说,我根本不喜欢这种态度(我认为这对那些花时间帮助你的人非常忘恩负义)而且实际上它会影响你的排名(因此会影响你可以/不能做的事情)网站)。如果您不介意,我想在继续回答您的问题之前了解更多信息:您为什么不奖励答案?
  • @Katie(我还在寻找你对我之前问题的回答)只是为了澄清一下:这段代码寻找的是一个字典键,包括标签中的所有字母,即字典键=“字典键”和标签=“字典”; “dictkey”是有效的。如果您想获得仅包含标签字母的字典键,即相同的单词但带有字符,最终以不同的顺序(上例中的“dictkey”是错误的);必须修改代码。我期待您对我的两个问题的回答。
  • 我很抱歉,非常感谢,如果您查看以前的问题,我已经给人们打分,并且留下 cmets 说我感谢他们的帮助。再次抱歉,我会继续改进。好的,谢谢你的帮助,对不起,我似乎忘恩负义,激怒了你。
  • @Katie 激怒了我?!大声笑这是不可能的。为了避免误解,我说得很清楚,但我并不生气(一点也不)。我只是在说我所看到的(以及我的想法):没有一个问题被授予。另外,请看一下我的更新答案。
【解决方案3】:

您在判断当前单词是否包含当前字符的 if 语句之外调用 MsgBox(item)。这意味着它会弹出每个字母,每个单词。如果您只想在单词中实际找到字母时显示,请将 MsgBox(item) 移动到 if 语句的前半部分。

我还建议遵循 Steven Doggart 的建议并反转循环嵌套的方式。如果字符是外循环,您可以在每个单词中多次获取消息框(例如,如果您的字母是“sdf”并且其中一个单词是“foods”,它将弹出 3 次)。

For Each item In hash
    For i = 0 To Letters.Length - 1
        OneCharacter = Letters.Substring(i, 1)
        If item.Contains(OneCharacter) Then
            Found = True
            AllCharacters = OneCharacter
            MsgBox(item)
        Else
            Found = False
        End If
    Next
Next

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多