123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package csvreader
- import (
- "encoding/csv"
- "fmt"
- "io"
- "os"
- "path/filepath"
- )
- func GetCSVFiles(dirPath string) ([]string, error) {
- var files []string
- err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
- if err != nil {
- return err
- }
- if !info.IsDir() && filepath.Ext(path) == ".csv" {
- files = append(files, path)
- }
- return nil
- })
- if err != nil {
- return nil, fmt.Errorf("failed to list CSV files in directory: %v", err)
- }
- return files, nil
- }
- func ReadCSVWithLimit(filePath string, delimiter rune, offset int, limit int) ([]string, [][]string, error) {
-
- file, err := os.Open(filePath)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to open file: %v", err)
- }
- defer file.Close()
-
- reader := csv.NewReader(file)
- reader.Comma = delimiter
-
- headers, err := reader.Read()
- if err != nil {
- return nil, nil, fmt.Errorf("failed to read headers from CSV: %v", err)
- }
-
- if offset == 0 {
- offset++
- }
-
- for i := 1; i < offset; i++ {
- if _, err := reader.Read(); err == io.EOF {
- return nil, nil, nil
- } else if err != nil {
- return nil, nil, fmt.Errorf("failed to skip rows in CSV: %v", err)
- }
- }
-
- records := make([][]string, 0, limit)
- for i := 0; i < limit; i++ {
- record, err := reader.Read()
- if err == io.EOF {
- break
- } else if err != nil {
- return nil, nil, fmt.Errorf("failed to read row from CSV: %v", err)
- }
- records = append(records, record)
- }
- return headers, records, nil
- }
|