Skip to content

Commit ef87102

Browse files
committed
file reader
1 parent 87d9a72 commit ef87102

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed

file-reader/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module reader
2+
3+
go 1.20

file-reader/read.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"encoding/csv"
6+
"fmt"
7+
"os"
8+
"strings"
9+
)
10+
11+
type User struct {
12+
Fname string
13+
Lname string
14+
}
15+
16+
func ReadNamesFromFile(filename string) ([]User, error) {
17+
file, err := os.Open(filename)
18+
if err != nil {
19+
return nil, err
20+
}
21+
defer file.Close()
22+
23+
reader := csv.NewReader(bufio.NewReader(file))
24+
reader.Comma = ' '
25+
26+
var names []User
27+
28+
for {
29+
record, err := reader.Read()
30+
if err != nil {
31+
break
32+
}
33+
34+
name := User{
35+
Fname: strings.TrimSpace(record[0]),
36+
Lname: strings.TrimSpace(record[1]),
37+
}
38+
names = append(names, name)
39+
}
40+
41+
return names, nil
42+
}
43+
44+
func ScanFileName() string {
45+
var filename string
46+
fmt.Print("Enter filename: ")
47+
fmt.Scanln(&filename)
48+
return filename
49+
}
50+
51+
func PrintNames(names []User) {
52+
for _, name := range names {
53+
fmt.Println(name.Fname, name.Lname)
54+
}
55+
}
56+
57+
func main() {
58+
filename := ScanFileName()
59+
60+
names, err := ReadNamesFromFile(filename)
61+
if err != nil {
62+
fmt.Println("Error:", err)
63+
return
64+
}
65+
66+
PrintNames(names)
67+
}

file-reader/read_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package main
2+
3+
import (
4+
"io/ioutil"
5+
"os"
6+
"testing"
7+
)
8+
9+
func TestReadNamesFromFileSuccess(t *testing.T) {
10+
// Create a temporary test file
11+
file, err := ioutil.TempFile("", "test_file_")
12+
if err != nil {
13+
t.Fatalf("Failed to create temporary test file: %v", err)
14+
}
15+
defer os.Remove(file.Name())
16+
17+
// Write test data to the file
18+
data := "John Smith\nJane Doe\n"
19+
if _, err := file.WriteString(data); err != nil {
20+
t.Fatalf("Failed to write test data to file: %v", err)
21+
}
22+
23+
// Close the file to flush changes to disk
24+
if err := file.Close(); err != nil {
25+
t.Fatalf("Failed to close test file: %v", err)
26+
}
27+
28+
// Call the function being tested
29+
got, err := ReadNamesFromFile(file.Name())
30+
if err != nil {
31+
t.Fatalf("ReadNamesFromFile failed: %v", err)
32+
}
33+
34+
// Check the result
35+
want := []User{
36+
{Fname: "John", Lname: "Smith"},
37+
{Fname: "Jane", Lname: "Doe"},
38+
}
39+
if len(got) != len(want) {
40+
t.Errorf("ReadNamesFromFile returned %d names, want %d", len(got), len(want))
41+
}
42+
for i, name := range want {
43+
if got[i].Fname != name.Fname || got[i].Lname != name.Lname {
44+
t.Errorf("ReadNamesFromFile returned %v, want %v", got[i], name)
45+
}
46+
}
47+
}
48+
49+
func TestReadNamesFromFileFailure(t *testing.T) {
50+
// Call the function being tested with a non-existent file
51+
_, err := ReadNamesFromFile("nonexistent_file.txt")
52+
if err == nil {
53+
t.Errorf("ReadNamesFromFile should have returned an error for non-existent file")
54+
}
55+
}

file-reader/test.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
John Smith
2+
Jane Doe
3+
Bob Johnson

0 commit comments

Comments
 (0)