github.com/schollz/clusters@v0.0.0-20221201012527-c6c68863636f/csv_importer.go (about) 1 package clusters 2 3 import ( 4 "bufio" 5 "encoding/csv" 6 "io" 7 "os" 8 "strconv" 9 ) 10 11 type csvImporter struct { 12 } 13 14 func CsvImporter() Importer { 15 return &csvImporter{} 16 } 17 18 func (i *csvImporter) Import(file string, start, end int) ([][]float64, error) { 19 if start < 0 || end < 0 || start > end { 20 return [][]float64{}, errInvalidRange 21 } 22 23 f, err := os.Open(file) 24 if err != nil { 25 return [][]float64{}, err 26 } 27 28 defer f.Close() 29 30 var ( 31 d = make([][]float64, 0) 32 r = csv.NewReader(bufio.NewReader(f)) 33 s = end - start + 1 34 g []float64 35 ) 36 37 Main: 38 for { 39 record, err := r.Read() 40 41 if err == io.EOF { 42 break 43 } else if err != nil { 44 return [][]float64{}, err 45 } 46 47 g = make([]float64, 0, s) 48 49 for j := start; j <= end; j++ { 50 f, err := strconv.ParseFloat(record[j], 64) 51 if err == nil { 52 g = append(g, f) 53 } else { 54 continue Main 55 } 56 } 57 58 d = append(d, g) 59 } 60 61 return d, nil 62 }