为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 扫描文本文件中的单词

Golang 扫描文本文件中的单词

Go
ITMISS 2022-05-23 16:05:27
我想将一个文本文件(file.txt)拆分为两个单独的大小相等的文本文件,例如 file1.txt 和 file2.txt。我在拆分中的策略是扫描单词并计算它们,然后将前半部分的单词写入 file1.txt,其余的写入 file2.txt 这是代码:package mainimport (    "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() 返回一个布尔值。在计算了单词的数量之后,如何在 Golang 中实现这样的代码,将前半部分的单词写入 file1.txt,其余的写入 file2.txt?
查看完整描述

3 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

解决方案:


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])


        }

    }

.

.

.


查看完整回答
反对 回复 2022-05-23
?
大话西游666

TA贡献1817条经验 获得超14个赞

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)

    }


}


查看完整回答
反对 回复 2022-05-23
?
慕后森

TA贡献1802条经验 获得超5个赞

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


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++

}

上面,file1和file2是两个输出文件。


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


w:=0

for scanner.Scan() {

   var outfile *os.File

   if w%2==0 {

     outfile=file1

   } else {

     outfile=file2

   }

   fmt.Fprintln(outfile,scanner.Text())

   w++

}


查看完整回答
反对 回复 2022-05-23
  • 3 回答
  • 0 关注
  • 227 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号