Как перебрать текстовый файл со строками, состоящими из нескольких чисел, при подсчете чисел - PullRequest
0 голосов
/ 02 июля 2019

Файл выглядит примерно так:

John Smith
100 90 80 90
50 60 80 99 40 20

Но в файле может быть любое количество людей / оценок. Я знаю, как пройти по циклу и получить имя и фамилию человека, но как я могу пройти по первой строке чисел, добавить их к своей общей сумме, затем пройти по второй строке и добавить их к другой итоговой сумме?

Я не нашел способа проверить конец строки в Go, поэтому не знаю, как отличить первую строку чисел от второй.

Вот что я пробовал:

package main

import (
    "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 Ответ

2 голосов
/ 02 июля 2019

Самый простой подход - циклически проходить по файлу.Примерно так:

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

Посмотреть на playgrOund .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...