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  }