【问题标题】:Count words in an external file using delimiter of a space使用空格分隔符计算外部文件中的单词
【发布时间】:2019-03-23 16:01:12
【问题描述】:

我想使用空格分隔符 (" ") 来计算文本文件中的单词数,但是我很挣扎。

Dim counter = 0
Dim delim = " "
Dim fields() As String
fields = Nothing

Dim line As String
line = Input

While (SR.EndOfStream)
    line = SR.ReadLine()

End While

Console.WriteLine(vbLf & "Reading File.. ")

fields = line.Split(delim.ToCharArray())
For i = 0 To fields.Length
    counter = counter + 1

Next

SR.Close()
Console.WriteLine(vbLf & "The word count is {0}", counter)

我不知道如何打开文件并获得这样做,很困惑;想要一个解释,以便我可以编辑和理解它。

【问题讨论】:

  • 看来您可以使用StreamReader Class documentation 中的第一个示例来帮助您完成已启动的代码。
  • File.ReadAllText。如果分隔符是空格(字符 32),则不需要指定分隔符:它是默认分隔符。这就是你所需要的。
  • @jimi,您好,您提供的链接在 C 中是新的,我该怎么做,所以我将如何在 VB 中编写它
  • 它位于C#C++F#VB.Net。在页面的右上角,您可以找到语言选择器。
  • @jimi Dim path As String = "z:test.txt" Dim length = Len(path) Console.WriteLine(length) ,我这样做是正确的,不起作用

标签: vb.net count character delimiter


【解决方案1】:

您将读取一个文件作为数据源,所以让我们创建一个变量来引用它的文件名:

Dim srcFile = "C:\temp\twolines.txt"

正如您已经展示的那样,需要一个变量来保存找到的单词数:

Dim counter = 0

要从文件中读取,StreamReader 将完成这项工作。现在,我们查看它的文档(是的,真的)并注意到它有一个Dispose 方法。这意味着我们必须在使用它之后显式处理它,以确保在下次重新启动计算机之前不会占用任何系统资源(例如,可能有一个“memory leak” )。幸运的是,有 Using 构造可以为我们解决这个问题:

Using sr As New StreamReader(srcFile)

现在我们要逐行遍历文件的内容,直到文件结束:

    While Not sr.EndOfStream

然后我们要读取一行并找出它有多少由空格分隔的项目:

        counter += sr.ReadLine().Split({" "c}, StringSplitOptions.RemoveEmptyEntries).Length

+= 运算符就像说“将 n 添加到 a”而不是说“a = a + n”。 {" "c} 是字符 " "c 的文字数组。 c 告诉它这是一个字符,而不是一个字符的字符串。 StringSplitOptions.RemoveEmptyEntries 表示如果有 "one two" 的文本,那么它将忽略多余的空格。

所以,如果你正在编写一个控制台程序,它可能看起来像:

Imports System.IO

Module Module1

    Sub Main()

        Dim srcFile = "C:\temp\twolines.txt"
        Dim counter = 0

        Using sr As New StreamReader(srcFile)
            While Not sr.EndOfStream
                counter += sr.ReadLine().Split({" "c}, StringSplitOptions.RemoveEmptyEntries).Length
            End While
        End Using

        Console.WriteLine(counter)
        Console.ReadLine()

    End Sub

End Module

任何修饰,例如写出数字代表什么或错误检查都由您决定。

【讨论】:

    【解决方案2】:

    使用 Path.Combine,您不必担心斜杠或反斜杠的去向。您可以使用 Environment 类轻松获取特殊文件夹的路径。 System.IO 的 File 类是共享的,因此您不必创建实例。

    Public Sub Main()
        Dim p As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "Chapters.txt")
        Debug.Print(Environment.SpecialFolder.MyDocuments.ToString)
        Dim count As Integer = GetCount(p)
        Console.WriteLine(count)
        Console.ReadKey()
    End Sub
    Private Function GetCount(Path As String) As Integer
        Dim s = File.ReadAllText(Path)
        Return s.Split().Length
    End Function
    

    【讨论】:

      【解决方案3】:

      使用Split函数,直接得到结果数组的长度加1。

      【讨论】:

      • OP 已经完成了那部分,问题是“我不知道如何打开文件”部分。
      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多