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

从多个点扫描文件

从多个点扫描文件

Go
潇潇雨雨 2023-07-31 15:29:19
我有一个文件abc.txt,其中包含打印两次的字母表,并用换行符分隔abcdefghijklmopqrstuvwxyz abcdefghijklmopqrstuvwxyz我想创建一个可以同时解析行的解析器。例如,每行一个 goroutine。我当前尝试执行此操作的流程是:创建一个通道来接收文本行为每行创建一个新的扫描仪将扫描仪和通道传递给 goroutine主进程中的处理结果然而,只有一台扫描仪返回有用的输出。我想做的代码是这样的:func main() {    file, err := os.Open("./strangeness/abc.txt")    if err != nil {        log.Panic(err)    }    defer file.Close()    inChan := make(chan string)    for i := 0; i < 2; i++ {        var scanner scanner.Scanner        file.Seek(27, 0)        scanner.Init(file)        go parseLine(fmt.Sprintf("Scanner %v:", i), &scanner, inChan)    }    for msg := range inChan {        fmt.Println(msg)    }}func parseLine(name string, scanner *scanner.Scanner, out chan string) {    for i := 0; i < 26; i++ {        out <- fmt.Sprintf("%s %c", name, scanner.Next())    }}我想我可能对 go 的text/scanner工作原理或文件的一般工作原理有一些误解,但我无法追踪错误的实际来源。
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

该问题似乎是由于 2 个文件扫描仪同时移动头部所致。


可以通过创建 2 个文件句柄(每个句柄都有自己的扫描仪)来实现所需的结果。以下对我有用


package main


import (

    "fmt"

    "log"

    "os"

    "text/scanner"

    "time"

)


func main(){

    var file [2]*os.File

    var err error

    file[0], err = os.Open("./abc.txt")

    file[1], err = os.Open("./abc.txt")

    if err != nil {

        log.Panic(err)

    }

    defer file[0].Close()

    defer file[1].Close()

    var scanner [2]scanner.Scanner

    inChan := make(chan string)



    for i := 0; i < 2; i++ {

        var n int64 = (int64)(i) * 26

        file[i].Seek(n, 0)


        scanner[i].Init(file[i])

        fmt.Println(scanner[0].Pos)

        go parseLine(fmt.Sprintf("Scanner %v:", i), &scanner[i], inChan)

    }


    for msg := range inChan {

        fmt.Println(msg)

    }

}


func parseLine(name string, scanner *scanner.Scanner, out chan string) {

    for i := 0; i < 26; i++ {

        out <- fmt.Sprintf("%s %c", name, scanner.Next())

    }

    time.Sleep(time.Second * 10)

    close(out)

}


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信