123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package csvreader
- import (
- "encoding/csv"
- "fmt"
- "io"
- "os"
- "path/filepath"
- )
- // GetCSVFiles 获取指定目录下的所有 CSV 文件路径
- 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
- }
- // ReadCSVWithLimit 分页从 CSV 文件中读取数据,跳过表头
- func ReadCSVWithLimit(filePath string, delimiter rune, offset int, limit int) ([]string, [][]string, error) {
- // 打开 CSV 文件
- file, err := os.Open(filePath)
- if err != nil {
- return nil, nil, fmt.Errorf("failed to open file: %v", err)
- }
- defer file.Close()
- // 创建 CSV Reader
- 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)
- }
- // 如果这是第一次读取,即 offset 为 0,直接从第 1 行数据开始读取
- if offset == 0 {
- offset++ // 表头已经读取,跳过表头
- }
- // 跳过 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
- }
|