package utils import ( "encoding/csv" "io" "strings" ) type CSVParseResult struct { ICCIDs []string TotalCount int ParseErrors []CSVParseError } type CSVParseError struct { Line int ICCID string Reason string } func ParseICCIDFromCSV(reader io.Reader) (*CSVParseResult, error) { csvReader := csv.NewReader(reader) csvReader.FieldsPerRecord = -1 csvReader.TrimLeadingSpace = true result := &CSVParseResult{ ICCIDs: make([]string, 0), ParseErrors: make([]CSVParseError, 0), } lineNum := 0 for { record, err := csvReader.Read() if err == io.EOF { break } lineNum++ if err != nil { result.ParseErrors = append(result.ParseErrors, CSVParseError{ Line: lineNum, Reason: "CSV 解析错误: " + err.Error(), }) continue } if len(record) == 0 { continue } iccid := strings.TrimSpace(record[0]) if iccid == "" { continue } if lineNum == 1 && isHeader(iccid) { continue } result.TotalCount++ result.ICCIDs = append(result.ICCIDs, iccid) } return result, nil } func isHeader(value string) bool { lower := strings.ToLower(value) return lower == "iccid" || lower == "卡号" || lower == "号码" }