0

I have a txt file :

2
Data 5 1.32
DataSecond 4 5.41
4
...

And so on. How to read the first line to know the count and then go on spliting the other lines to get individual parameters? I tried doing as follows, but it is obviously wrong.

f, err := os.Open("DATA.txt")
check(err)
s := bufio.NewScanner(f)
for s.Scan() {
    line := s.Text()
    count, err := strconv.Atoi(line)
    check(err)
    for i := 0; i < count; i++ {
        testArray := strings.Fields(s.Text())
        for _, v := range testArray {
            fmt.Println(v)
        }
    }
}
ssemilla
  • 3,900
  • 12
  • 28
Ričardas
  • 3
  • 2
  • Possible duplicate of [Golang: How to read a text file?](https://stackoverflow.com/questions/36111777/golang-how-to-read-a-text-file) – Shudipta Sharma Nov 23 '18 at 16:28

2 Answers2

1

You just forgot to Scan() inside the inner loop.

f, err := os.Open("DATA.txt")
check(err)
s := bufio.NewScanner(f)
for s.Scan() {
    line := s.Text()
    count, err := strconv.Atoi(line)
    check(err)
    for i := 0; i < count && s.Scan(); i++ {
        testArray := strings.Fields(s.Text())
        for _, v := range testArray {
            fmt.Println(v)
        }
    }
}
ssemilla
  • 3,900
  • 12
  • 28
0

You could do something like this, read the single lines into a count int and use it as a test. If count is > 0 then use sscanf to get the other values

func main() {
    f, err := os.Open("DATA.txt")
    check(err)
    s := bufio.NewScanner(f)
    count := 0
    for s.Scan() {
        line := s.Text()
        if count < 1 {
            count, err = strconv.Atoi(line)
            check(err)
            continue
        }
        count--
        var tag string
        var n int
        var f float64
        fmt.Sscanf(line, "%s %d %f", &tag, &n, &f)
        // not sure what you really wnant to do with the data!
        fmt.Println(n, f, tag)
    }
}
Vorsprung
  • 32,923
  • 5
  • 39
  • 63