csvreader.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package csvreader
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "io"
  6. "os"
  7. "path/filepath"
  8. )
  9. // GetCSVFiles 获取指定目录下的所有 CSV 文件路径
  10. func GetCSVFiles(dirPath string) ([]string, error) {
  11. var files []string
  12. err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
  13. if err != nil {
  14. return err
  15. }
  16. if !info.IsDir() && filepath.Ext(path) == ".csv" {
  17. files = append(files, path)
  18. }
  19. return nil
  20. })
  21. if err != nil {
  22. return nil, fmt.Errorf("failed to list CSV files in directory: %v", err)
  23. }
  24. return files, nil
  25. }
  26. // ReadCSVWithLimit 分页从 CSV 文件中读取数据,跳过表头
  27. func ReadCSVWithLimit(filePath string, delimiter rune, offset int, limit int) ([]string, [][]string, error) {
  28. // 打开 CSV 文件
  29. file, err := os.Open(filePath)
  30. if err != nil {
  31. return nil, nil, fmt.Errorf("failed to open file: %v", err)
  32. }
  33. defer file.Close()
  34. // 创建 CSV Reader
  35. reader := csv.NewReader(file)
  36. reader.Comma = delimiter
  37. // 读取表头
  38. headers, err := reader.Read()
  39. if err != nil {
  40. return nil, nil, fmt.Errorf("failed to read headers from CSV: %v", err)
  41. }
  42. // 如果这是第一次读取,即 offset 为 0,直接从第 1 行数据开始读取
  43. if offset == 0 {
  44. offset++ // 表头已经读取,跳过表头
  45. }
  46. // 跳过 offset 指定的行数
  47. for i := 1; i < offset; i++ {
  48. if _, err := reader.Read(); err == io.EOF {
  49. return nil, nil, nil // 如果已经读到文件末尾,返回空数据
  50. } else if err != nil {
  51. return nil, nil, fmt.Errorf("failed to skip rows in CSV: %v", err)
  52. }
  53. }
  54. // 读取记录
  55. records := make([][]string, 0, limit)
  56. for i := 0; i < limit; i++ {
  57. record, err := reader.Read()
  58. if err == io.EOF {
  59. break // 如果到达文件末尾,停止读取
  60. } else if err != nil {
  61. return nil, nil, fmt.Errorf("failed to read row from CSV: %v", err)
  62. }
  63. records = append(records, record)
  64. }
  65. return headers, records, nil
  66. }