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 }