Golang按顺序将文本文件分割成两个大小相等的文件

Golang按顺序将文本文件分割成两个大小相等的文件

func WordbyWordScan() { //A function for dividing a text file into two file texts.
    file, err := os.Open("file.txt.txt") //Open a file for doing operation on it.
    if err != nil {
        log.Fatal(err)
    }
    file1, err := os.Create("file1.txt.txt") //Create a file
    if err != nil {
        panic(err)
    }

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

    defer file.Close()                //close file at the end.
    defer file1.Close()               //close file at the end.
    defer file2.Close()               //close file at the end.
    file.Seek(0, 0)                   // "Seek sets the offset for the next Read or Write on file to offset."
    scanner := bufio.NewScanner(file) // "NewScanner returns a new Scanner to read from file"
    scanner.Split(bufio.ScanWords)    // "Set the split function for the scanning operation."
    w := 0
    for scanner.Scan() { //writing to file1 and file2
        var outfile *os.File
        if w%2 == 0 {
            outfile = file1
        } else {
            outfile = file2
        }
        fmt.Fprintln(outfile, scanner.Text()) //"Fprintln formats using the default formats for its operands and writes to outfile."
        w++
    }
    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }

}

上面的代码是按单词逐个分割文件,而不是按顺序将前半部分单词和后半部分单词分开。例如,这个句子“Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer object, creating another object.”应该像这样分割:

前半部分:“Package bufio implements buffered I/O. It wraps an io”

后半部分:“.Reader or io.Writer object, creating another object.”

如果有人有办法解决这个问题,我期待您的回复。


更多关于Golang按顺序将文本文件分割成两个大小相等的文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

当前错误的输出是什么?

更多关于Golang按顺序将文本文件分割成两个大小相等的文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


为什么提出一个完整的问题如此困难?请告诉我们:

  • 你做了什么
  • 你期望得到什么
  • 你实际得到了什么

你好, 只需将一些文本复制粘贴到 file.txt 文件中,然后运行代码,你就能看到结果。 期待你的回复。

for scanner.Scan() { //writing to file1 and file2
        var outfile *os.File
        if w%2 == 0 {
            outfile = file1
        } else {
            outfile = file2
        }
        fmt.Fprintln(outfile, scanner.Text()) //"Fprintln formats using the default formats for its operands and writes to outfile."
        w++
    }

上面的这部分代码需要修改才能得到我满意的结果。我只是想按顺序将前半部分单词与后半部分单词分开。这很难理解吗?如果你需要更多解释,我会发送截图或文件结果。

期待你的回复。

stackoverflow.com

Burak Serdar

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

标签: go, text, word, scanning

期待您的回复。

解决方案:

var s[]string 
        .
        .
        .
            
      for scanner.Scan() { // 将file.txt中的字符串值存储或追加到数组s中。

                    s = append(s, scanner.Text())

                }

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

                    log.Fatal(err)

                }

                //写入file1和file2
                if len(s)%2 == 0 { // 如果单词出现次数是偶数。
                    for i := 0; i <= len(s)/2-1; i++ { // 将前半部分单词写入file1
                        fmt.Fprintln(file1, s[i])
                    }
                    for j := len(s) / 2; j < len(s); j++ { // 将后半部分单词写入file2
                        fmt.Fprintln(file2, s[j])
                    }
                } else { // 如果单词出现次数是奇数。
                    for i := 0; i <= len(s)/2; i++ { // 将第一部分单词写入file1
                        fmt.Fprintln(file1, s[i])
                    }
                    for j := len(s)/2 + 1; j < len(s); j++ { // 将第二部分单词写入file2
                        fmt.Fprintln(file2, s[j])
                    }
                }
        .
        .
        .

要实现按顺序将文本文件分割成两个大小相等的文件(按字节大小而非单词数),需要先获取文件总大小,然后按字节位置进行分割。以下是修改后的代码:

package main

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

func SplitFileByHalf() {
    // 打开源文件
    srcFile, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer srcFile.Close()

    // 获取文件信息以确定大小
    fileInfo, err := srcFile.Stat()
    if err != nil {
        log.Fatal(err)
    }
    fileSize := fileInfo.Size()
    halfSize := fileSize / 2

    // 创建输出文件
    file1, err := os.Create("file1.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file1.Close()

    file2, err := os.Create("file2.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file2.Close()

    // 复制前半部分到file1
    bytesWritten1, err := io.CopyN(file1, srcFile, halfSize)
    if err != nil && err != io.EOF {
        log.Fatal(err)
    }

    // 复制剩余部分到file2
    bytesWritten2, err := io.Copy(file2, srcFile)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("文件分割完成: file1=%d字节, file2=%d字节\n", bytesWritten1, bytesWritten2)
}

func SplitFileByHalfWithBoundary() {
    // 如果需要确保在单词边界处分割,使用此函数
    srcFile, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer srcFile.Close()

    fileInfo, err := srcFile.Stat()
    if err != nil {
        log.Fatal(err)
    }
    fileSize := fileInfo.Size()
    halfSize := fileSize / 2

    // 创建输出文件
    file1, err := os.Create("file1.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file1.Close()

    file2, err := os.Create("file2.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer file2.Close()

    // 读取到中间位置
    buf := make([]byte, halfSize)
    n, err := srcFile.Read(buf)
    if err != nil && err != io.EOF {
        log.Fatal(err)
    }

    // 向前查找最近的单词边界
    if n > 0 {
        // 从中间位置向前查找空格或标点
        for i := n - 1; i >= 0; i-- {
            if buf[i] == ' ' || buf[i] == '.' || buf[i] == ',' || buf[i] == '\n' {
                // 写入file1直到边界
                file1.Write(buf[:i+1])
                // 重置文件指针到边界后
                srcFile.Seek(int64(i+1)-halfSize, io.SeekCurrent)
                break
            }
        }
    }

    // 复制剩余内容到file2
    _, err = io.Copy(file2, srcFile)
    if err != nil {
        log.Fatal(err)
    }
}

func main() {
    // 简单按字节分割
    SplitFileByHalf()
    
    // 或在单词边界处分割
    // SplitFileByHalfWithBoundary()
}

如果需要确保分割点在单词边界(空格或标点)处,可以使用SplitFileByHalfWithBoundary函数。这个函数会从中间位置向前查找最近的分隔符,确保不会在单词中间分割。

对于示例文本"Package bufio implements buffered I/O. It wraps an io.Reader or io.Writer object, creating another object.",SplitFileByHalfWithBoundary会按您期望的方式分割:

  • file1.txt: “Package bufio implements buffered I/O. It wraps an io”
  • file2.txt: “.Reader or io.Writer object, creating another object.”
回到顶部