Read reads data from file
()
| 59 | |
| 60 | // Read reads data from file |
| 61 | func (fl *File) Read() error { |
| 62 | st, err := os.Stat(fl.FName) |
| 63 | if err != nil { |
| 64 | return err |
| 65 | } |
| 66 | fl.ModTime = st.ModTime() |
| 67 | f, err := os.Open(fl.FName) |
| 68 | if err != nil { |
| 69 | return err |
| 70 | } |
| 71 | defer f.Close() |
| 72 | |
| 73 | if fl.Data != nil { |
| 74 | fl.Data = fl.Data[:0] |
| 75 | } |
| 76 | |
| 77 | scan := bufio.NewScanner(f) |
| 78 | ln := 0 |
| 79 | for scan.Scan() { |
| 80 | s := string(scan.Bytes()) |
| 81 | var fd []string |
| 82 | if fl.Commas { |
| 83 | fd = strings.Split(s, ",") |
| 84 | } else { |
| 85 | fd = strings.Split(s, "\t") |
| 86 | } |
| 87 | if ln == 0 { |
| 88 | if len(fd) == 0 || strings.Count(s, ",") > strings.Count(s, "\t") { |
| 89 | fl.Commas = true |
| 90 | fd = strings.Split(s, ",") |
| 91 | } |
| 92 | fl.Heads = fd |
| 93 | fl.Widths = make([]int, len(fl.Heads)) |
| 94 | fl.FitWidths(fd) |
| 95 | ln++ |
| 96 | continue |
| 97 | } |
| 98 | fl.Data = append(fl.Data, fd) |
| 99 | fl.FitWidths(fd) |
| 100 | ln++ |
| 101 | } |
| 102 | fl.Rows = ln - 1 // skip header |
| 103 | return err |
| 104 | } |
| 105 | |
| 106 | // FitWidths expands widths given current set of fields |
| 107 | func (fl *File) FitWidths(fd []string) { |