I'm trying to read a CSV file to store the values in a variable. However, I couldn't access the variables outside of the for loop
func GetKeys(filename string) {
var record []string
var err error
file, err := os.Open(filename)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Create a new reader.
reader := csv.NewReader(bufio.NewReader(file))
for {
record, err = reader.Read()
// Stop at EOF.
if err == io.EOF {
break
}
fmt.Printf("%v", record) // works fine
fmt.Printf("%v
", record[0]) // works fine too
}
fmt.Printf("%v
", record) // returns empty slice
}
func main() {
GetKeys("credentials.csv")
}
Your loop breaks when reader.Read()
returns io.EOF
. This happens when your input is consumed.
At the same time (when io.EOF
is returned), the returned record will be nil
. Reader.Read()
:
If there is no data left to be read, Read returns nil, io.EOF.
So you assign nil
to the record
variable, the loop breaks, and you inspect the record
variable.
If your intent is to hold the last record, store it in a separate variable, and do not "overwrite" it with the last nil
record:
var lastRecord []string
for {
record, err = reader.Read()
// Stop at EOF.
if err == io.EOF {
break
}
lastRecord = record
fmt.Printf("%v", record) // works fine
fmt.Printf("%v
", record[0]) // works fine too
}
fmt.Printf("%v
", lastRecord) // this will be the last non-nil record