Friday, February 5, 2021

GoLang - process multiple files concurrently

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strconv"
    "strings"
)

func check(e error) {
    if e != nil {
        panic(e)
    }
}

func analyze(msg string) {
    var total float64
    var min float64
    var max float64
    var numlines float64
    total = 0
    numlines = 0
    max = 0
    min = 1000000000
    dat2 := make([]string200)
    // read the file
    daterr := ioutil.ReadFile(msg)
    check(err)
    dat2 = strings.Split(string(dat), "\r\n")
    // iterate through the text file
    for i := 0; i < len(dat2); i++ {
        //fmt.Println("inside for loop", i)
        if figerr := strconv.ParseFloat(dat2[i], 64); err == nil {
            //total + new value
            total = total + fig
            numlines = numlines + 1
            if min > fig {
                min = fig
            }
            if max < fig {
                max = fig
            }

            //fmt.Println(fig)
        } else {
            // print error if not parsed
            fmt.Println(err)
            break
        }
    }
    fmt.Println("Analysis of file:", msg)
    fmt.Println("Total is:", total)
    fmt.Println("Total figures:", numlines)
    fmt.Println("Average is:", total/numlines)
    fmt.Println("Max: ", max, "Min: ", min)
}

func main() {

    var mystring string
    myslice := make([]string3)

    myslice[0] = "random_numbers1.txt"
    myslice[1] = "random_numbers2.txt"
    myslice[2] = "random_numbers3.txt"

    for i := 0; i < len(myslice); i++ {
        // trigger analyze as go routine
        // no need to use channels as we dont need to Queue anything
        go analyze(myslice[i])
    }

    for {
        fmt.Println("\r\n Enter Filename:")
        fmt.Scanln(&mystring)
        fmt.Printf("%s", mystring)
        if mystring == "q" {
            os.Exit(0)
        } else {
            go analyze(mystring)
        }

    }

}

No comments:

Post a Comment