Home > Enterprise >  My program in Golang prints the first input two times in the file
My program in Golang prints the first input two times in the file

Time:11-26

I try to get some CSV formatted string as input and then to print it to an actual CSV file. It works but it prints the first string 2 times.

My code looks like this:

func main() {
scanner := bufio.NewScanner(os.Stdin)
n := 0
inputFile, err := os.Create("input.csv") //create the input.csv file
if err != nil {
log.Fatal(err)
}

csvwriter := csv.NewWriter(inputFile)

fmt.Println("How many records ?")
fmt.Scanln(&n)
fmt.Println("Enter the records")
var lines \[\]\[\]string
for i := 0; i \< n; i   {
scanner.Scan()
text := scanner.Text()
lines = append(lines, \[\]string{text})
err := csvwriter.WriteAll(lines)
if err != nil {
return
}
}
csvwriter.Flush()
inputFile.Close()
}

for n=2 and the records:

abcd, efgh, ijklmn
opq, rstu, vwxyz

the output looks like this:

"abcd, efgh, ijklmn"
"abcd, efgh, ijklmn"
"opq, rstu, vwxyz"

It is my first time working with Golang and I am a little bit lost :D

CodePudding user response:

csvwriter.WriteAll(lines) WriteAll writes multiple CSV records to w using Write and then calls Flush, returning any error from the Flush.

You are appending lines every time you read in a loop and flushing to the file.

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    n := 0
    inputFile, err := os.Create("input.csv") //create the input.csv file
    if err != nil {
        log.Fatal(err)
    }
    defer inputFile.Close()

    csvwriter := csv.NewWriter(inputFile)

    fmt.Println("How many records ?")
    fmt.Scanln(&n)
    fmt.Println("Enter the records")
    var lines [][]string
    for i := 0; i < n; i   {
        scanner.Scan()
        text := scanner.Text()
        lines = append(lines, []string{text})
    }
    err = csvwriter.WriteAll(lines)
    if err != nil {
        return
    }
    
}


CodePudding user response:

You were writing the csv in loop so that first line printed double. Here is the corrected code.

package main

import (
    "bufio"
    "encoding/csv"
    "fmt"
    "log"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    n := 0
    inputFile, err := os.Create("input.csv") //create the input.csv file
    if err != nil {
        log.Fatal(err)
    }
    defer func() {
        inputFile.Close()
    }()

    csvwriter := csv.NewWriter(inputFile)
    defer func() {
        csvwriter.Flush()
    }()
    fmt.Println("How many records ?")
    fmt.Scanln(&n)
    fmt.Println("Enter the records")
    var lines [][]string
    for i := 0; i < n; i   {
        scanner.Scan()
        text := scanner.Text()
        lines = append(lines, []string{text})

    }
    err = csvwriter.WriteAll(lines)
    if err != nil {
        return
    }
}

  •  Tags:  
  • go
  • Related