Сканирование слов в текстовом файле по Golang - PullRequest
0 голосов
/ 20 марта 2020

Я хочу разделить текстовый файл (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 - Слова

Насколько я могу догадаться, scanner.Scan () возвращает логическое значение. После подсчета количества слов, Как я могу реализовать такой код в Golang, в котором состояния записывают первую половину слов в file1.txt, а остальные в file2.txt?

Ответы [ 3 ]

0 голосов
/ 20 марта 2020
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)
    }

}
0 голосов
/ 02 апреля 2020

Решение:

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

        }
    }
.
.
.
0 голосов
/ 20 марта 2020

Если вы хотите разрезать файл пополам, то вы на полпути. После подсчета слов просто go вернитесь и прочитайте файл снова, записав половину в один файл наполовину в другой:

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