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

如何循环遍历包含多个数字的行的文本文件,同时对数字进行计数

如何循环遍历包含多个数字的行的文本文件,同时对数字进行计数

Go
陪伴而非守候 2023-06-26 17:57:59
该文件看起来像:John Smith100 90 80 9050 60 80 99 40 20但文件中可以有任意数量的人员/等级。我知道如何循环并获取该人的名字和姓氏,但是如何循环第一行数字,将它们添加到自己的总计中,然后循环第二行并将它们添加到另一个总计中?我还没有找到一种方法来检查Go中的行尾,所以我不知道如何区分第一行数字和第二行数字。这是我尝试过的:package mainimport (    "fmt"     "os"    "log"    "bufio"    //"unicode"    //"container/list")type Student struct {    FirstName string    LastName string}func main(){    fmt.Println("What is the name of your file?\n")    var filename string    fmt.Scan(&filename)    file, err := os.Open(filename)    if err != nil {        log.Fatal(err)    }    scanner := bufio.NewScanner(file)    scanner.Split(bufio.ScanWords)    //var scanCount int = 0    //var studentCount = 1    //var gradeSum = 0    //var gradeAvg = 0    var students [100]Student    for scanner.Scan() {        students[0].FirstName = scanner.Text()        students[0].LastName = scanner.Text()        fmt.Println(students[0].FirstName)        //count ++    }}这是我到目前为止所拥有的。我尝试过的所有涉及数字的方法都不起作用,所以我将其删除了。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

最简单的方法是按行循环遍历文件。像这样的东西:


package main


import (

    "bufio"

    "fmt"

    "log"

    "strconv"

    "strings"

)


type Student struct {

    FirstName string

    LastName  string

}


func main() {

    fmt.Println("What is the name of your file?\n") var filename string 

    fmt.Scan(&filename)


    file, err := os.Open(filename)

    if err != nil {

     log.Fatal(err)

    }

    scanner := bufio.NewScanner(file)

    for scanner.Scan() {

        line := scanner.Text()

        if len(line) == 0 {

            // skip blank lines

            continue

        }

        if '0' <= line[0] && line[0] <= '9' {

            sum := 0

            for _, field := range strings.Fields(line) {

                n, err := strconv.Atoi(field)

                if err != nil {

                    log.Fatal(err)

                }

                sum += n

            }

            fmt.Println(sum)

        } else {

            fields := strings.Fields(line)

            if len(fields) != 2 {

                log.Fatal("don't know how to get first name last name")

            }

            fmt.Println("First:", fields[0], "Last:", fields[1])

        }

    }

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

        log.Fatal(err)

    }

}

在游乐场上看到它



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

添加回答

举报

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