使用 Golang 扫描文本文件中的单词

Scanning words in a text file by Golang

我想将一个文本文件 (file.txt) 拆分为两个独立的大小相等的文本文件,例如 file1.txt 和 file2.txt。我在拆分中的策略是扫描单词并对其进行计数,然后将单词的前半部分写入file1.txt,其余部分写入file2.txt 这是代码:

package main
import (
    "bufio"
    "fmt"
    "log"
    "os"
)
func main() {
    WordbyWordScan()
}
func WordbyWordScan() {
    file, err := os.Open("file.txt.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    scanner.Split(bufio.ScanWords)
    count := 0
    for scanner.Scan() {
        fmt.Println(scanner.Text())
        count++
    }
    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%d\n", count)
}

https://godoc.org/bufio#example-Scanner--Words

据我所知 scanner.Scan() returns 一个布尔值。在计算了字数之后,如何在 Golang 中实现这样的代码,将前半部分单词写入 file1.txt,其余部分写入 file2.txt?

如果您想将文件切成两半,那么您已经完成了一半。数完字数后,简单地返回并再次读取文件,将一半写入一个文件,一半写入另一个文件:

file.Seek(0,0)
scanner = bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
w:=0
for scanner.Scan() {
   var outfile *os.File
   if w<count/2 {
     outfile=file1
   } else {
     outfile=file2
   }
   fmt.Fprintln(outfile,scanner.Text())
   w++
}

以上,file1file2是两个输出文件。

如果您不需要将文件切成两半,而只是将一半的单词放在一个文件中,另一半放在另一个文件中,则可以一次完成,无需计算。从第一个开始阅读时,只需切换要写入的文件即可:

w:=0
for scanner.Scan() {
   var outfile *os.File
   if w%2==0 {
     outfile=file1
   } else {
     outfile=file2
   }
   fmt.Fprintln(outfile,scanner.Text())
   w++
}
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    WordbyWordScan()
}
func WordbyWordScan() {
    file, err := os.Open("file.txt.txt")
    if err != nil {
        log.Fatal(err)
    }
    file1, err := os.Create("file1.txt.txt")
    if err != nil {
        panic(err)
    }

    file2, err := os.Create("file2.txt.txt")
    if err != nil {
        panic(err)
    }

    defer file.Close()
    defer file1.Close()
    defer file2.Close()

    file.Seek(0, 0)
    scanner := bufio.NewScanner(file)
    scanner.Split(bufio.ScanWords)
    w := 0

    for scanner.Scan() {
        var outfile *os.File
        if w%2 == 0 {
            outfile = file1
        } else {
            outfile = file2
        }
        fmt.Fprintln(outfile, scanner.Text())
        w++
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }

}

解决方案:

var s []string 
.
.
.
for scanner.Scan() {// storing or appending file.txt string values to array s.
        s = append(s, scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
    //writing to file1 and file2
    if len(s)%2 == 0 { // if the occurences of words is an even number.
        for i := 0; i <= len(s)/2-1; i++ { // Writing first half of words to file1
            fmt.Fprintln(file1, s[i])

        }

        for j := len(s) / 2; j < len(s); j++ { // Writing second half of words to file2
            fmt.Fprintln(file2, s[j])

        }
    } else { // if the occurences of words is an odd number.
        for i := 0; i <= len(s)/2; i++ { // Writing first part of words to file1
            fmt.Fprintln(file1, s[i])
        }

        for j := len(s)/2 + 1; j < len(s); j++ { // Writing second part of words to file2
            fmt.Fprintln(file2, s[j])

        }
    }
.
.
.