影刀RPA店群自动化:批量Excel数据清洗与异构格式统一实战

影刀RPA店群自动化:批量Excel数据清洗与异构格式统一实战

店群运营最烦人的任务之一,不是上架也不是客服,而是处理Excel

供应商发来的商品表格,列名乱七八糟:有的叫“商品名称”,有的叫“产品标题”,还有的叫“货品名”。价格列可能是文本格式,带“¥”符号。库存有的用“库存量”,有的用“数量”。更夸张的是,同一个Excel里,不同行的日期格式都不一样。

运营每天花大量时间手工清洗这些数据,然后才能导入系统上架。我们统计过,一个运营每天处理Excel的平均耗时是1.5小时,还经常出错。

后来我们用Python+影刀RPA搭建了一套批量Excel数据清洗与异构格式统一流水线,能自动识别列名、转换数据类型、校验必填项、导出标准化文件。

这篇文章不讲调度也不讲图片处理。专门聊聊店群场景下Excel数据处理的自动化工程实践:如何应对乱七八糟的列名、如何智能推断数据类型、如何校验业务规则、如何批量转换。

适用场景:多供应商、多格式、需要批量清洗Excel数据的店群项目。 技术栈:Python + pandas + openpyxl + 模糊匹配 + 规则引擎。


一、Excel数据清洗的三大痛点

先还原一个真实场景。

供应商A发来一个文件,列名是“产品ID”、“产品名称”、“售价(元)”、“库存数”。供应商B发来的列名是“SKU”、“商品标题”、“价格”、“库存”。供应商C更离谱,直接把中文列名藏在第三行,前两行是合并单元格的说明。

picture.image 运营需要把这些乱七八糟的Excel统一转换成系统要求的标准格式:sku,title,price,stock,category

picture.image 痛点一:列名不一致

人工识别“商品名称”“产品标题”“货品名”都对应title,费时费力。

picture.image

痛点二:数据类型混乱

价格列可能是“99.00”字符串,也可能是99数字,还可能带“¥99”。库存列可能有空格、千分位逗号。

痛点三:业务规则校验

picture.image 价格不能为0或负数,库存不能超过10000,SKU必须唯一。这些规则需要人工检查,容易遗漏。

自动化清洗的目标:上传原始Excel → 系统自动识别列映射 → 标准化转换 → 校验规则 → 输出可直接导入的标准化文件。


二、整体架构

picture.image

我们设计了一条Excel清洗流水线。

输入层:运营上传原始Excel文件(或多个文件)到指定目录。

解析层:Python读取Excel,定位表头所在行(自动跳过前导空行和合并单元格),提取列名。

映射层:将原始列名与系统标准字段进行模糊匹配,输出建议映射。运营可手动调整。

清洗层:按标准字段进行数据类型转换、缺失值填充、去空格、格式统一。

校验层:执行业务规则校验(唯一性、范围、必填),生成校验报告。

输出层:导出标准格式的Excel或CSV,供上架脚本直接使用。

整个流程支持批量处理(多个文件),并记录每个文件的清洗历史。


三、智能列名映射

核心功能:自动识别原始列名对应的标准字段。

我们维护了一个标准字段字典:

STANDARD_FIELDS = {
    "sku": ["sku", "商品编码", "产品ID", "货号", "SKU", "商品ID"],
    "title": ["title", "商品名称", "产品标题", "货品名", "商品标题", "名称"],
    "price": ["price", "价格", "售价", "销售价", "单价", "原价"],
    "stock": ["stock", "库存", "库存量", "数量", "库存数", "可售数量"],
    "category": ["category", "品类", "分类", "类目", "商品分类"]
}

对于给定的原始列名,使用模糊匹配(编辑距离或向量相似度)计算与每个标准字段的候选词列表的匹配度。

# column_mapper.py
from fuzzywuzzy import fuzz

def map_column(col_name):
    best_match = None
    best_score = 0
    for std_field, aliases in STANDARD_FIELDS.items():
        for alias in aliases:
            score = fuzz.partial_ratio(col_name.lower(), alias.lower())
            if score > best_score and score > 60:
                best_score = score
                best_match = std_field
    return best_match, best_score

例如,原始列名“产品标题”匹配title,得分95。原始列名“售价(元)”匹配price,得分82。

如果匹配得分低于阈值,会标记为“未识别”,需要人工干预。系统生成一个映射预览表,运营可以在界面上拖拽调整。

我们还支持学习模式:运营手动映射后,系统将新的同义词加入候选词库,下次遇到类似列名自动识别。


四、数据类型智能转换

识别出列对应的标准字段后,需要将原始值转换成正确的数据类型。

我们写了一个转换器,处理各种脏数据。

# data_cleaner.py
import re

class TypeConverter:
    @staticmethod
    def to_price(value):
        """价格转换:去除货币符号、空格,转为float"""
        if value is None or str(value).strip() == '':
            return None
        s = str(value).strip()
        # 去除货币符号
        s = re.sub(r'[¥$€]', '', s)
        # 去除千分位逗号
        s = s.replace(',', '')
        # 提取数字和小数点
        match = re.search(r'[\d\.]+', s)
        if match:
            return float(match.group())
        return None
        
    @staticmethod
    def to_stock(value):
        """库存转换:转为整数,处理空值"""
        if value is None or str(value).strip() == '':
            return 0
        s = str(value).strip()
        # 去除千分位逗号
        s = s.replace(',', '')
        try:
            return int(float(s))
        except:
            return 0
            
    @staticmethod
    def to_title(value):
        """标题清洗:去除首尾空格,保留原始值"""
        if value is None:
            return ''
        return str(value).strip()

对于日期字段(如“上架时间”),我们会统一转换成ISO格式YYYY-MM-DD,处理各种格式变体。

from dateutil import parser

def to_date(value):
    if isinstance(value, datetime):
        return value.date()
    try:
        return parser.parse(str(value)).date()
    except:
        return None

五、业务规则校验引擎

清洗完成后,系统对每行数据进行校验。

校验规则可配置(JSON),运营可根据需要调整。

{
  "rules": [
    {"field": "sku", "required": true, "unique": true, "pattern": "^[A-Z0-9]{6,}$"},
    {"field": "title", "required": true, "max_length": 100},
    {"field": "price", "required": true, "min": 0.01, "max": 99999.99},
    {"field": "stock", "required": true, "min": 0, "max": 10000},
    {"field": "category", "required": false, "allowed_values": ["服装", "家居", "3C"]}
  ]
}

校验器逐行执行规则,收集错误信息。

class Validator:
    def __init__(self, rules):
        self.rules = rules
        
    def validate_row(self, row, row_index):
        errors = []
        for rule in self.rules:
            field = rule["field"]
            value = row.get(field)
            if rule.get("required") and (value is None or value == ""):
                errors.append(f"第{row_index}行: {field}不能为空")
            if rule.get("min") is not None and value is not None and value < rule["min"]:
                errors.append(f"第{row_index}行: {field}最小值{rule['min']}")
            if rule.get("max") is not None and value is not None and value > rule["max"]:
                errors.append(f"第{row_index}行: {field}最大值{rule['max']}")
            if rule.get("pattern") and value and not re.match(rule["pattern"], str(value)):
                errors.append(f"第{row_index}行: {field}格式不正确")
            if rule.get("allowed_values") and value and value not in rule["allowed_values"]:
                errors.append(f"第{row_index}行: {field}不在允许值列表中")
        return errors

唯一性校验需要跨行检查,单独处理:

def check_uniqueness(rows, field):
    seen = set()
    duplicates = []
    for idx, row in enumerate(rows, start=2):
        val = row.get(field)
        if val and val in seen:
            duplicates.append((idx, val))
        else:
            seen.add(val)
    return duplicates

校验结果生成Excel报告,用颜色标记错误行,运营可以快速修正。


六、与影刀上架脚本的集成

清洗后的标准化Excel文件,可以直接被影刀上架脚本读取。

影刀脚本通过调用Python接口获取文件路径,然后用pandas读取,逐行上架。

# upload_with_cleaned_data.py
def upload_from_cleaned_excel(file_path):
    df = pd.read_excel(file_path)
    for _, row in df.iterrows():
        sku = row['sku']
        title = row['title']
        price = row['price']
        stock = row['stock']
        # 调用上架API或影刀脚本
        upload_product(sku, title, price, stock)

也可以将清洗后的数据直接写入数据库,影刀脚本从数据库读取,避免每次读取Excel。


七、批量处理与进度监控

支持多个Excel文件批量处理,使用后台任务队列(Celery),运营上传后无需等待,完成后收到通知。

我们做了一个简单的Web界面,展示每个文件的处理状态:上传、清洗中、完成、失败。

对于失败的文件,提供下载错误报告和原始文件的功能。


八、真实踩坑与经验

坑1:Excel中的空行和合并单元格

供应商的文件经常前几行是标题说明,真正的表头在第N行。我们实现了自动检测:扫描前20行,找到第一个包含标准字段关键词的行作为表头。

坑2:大文件处理内存溢出

几十MB的Excel用pandas读取会占用大量内存。解决方案:分块读取(pd.read_excel(..., chunksize=5000)),逐块处理。

坑3:编码问题导致中文乱码

CSV文件常出现GBK/UTF-8编码混淆。我们检测文件编码(chardet)后自动转换。

坑4:供应商修改了列名,映射失效

每次清洗后系统记录映射,当映射失败时自动降级到人工确认,并提示“列名已变更”。


九、效果数据与收益

这套系统上线后:

  • Excel清洗平均耗时:从1.5小时降到5分钟
  • 数据错误率:从8%降到0.5%
  • 运营每月节省时间:约30小时
  • 上架脚本首次导入成功率:从85%提升到98%

一个典型案例:某次大促前,供应商一次性提供了3000个商品的Excel。运营手工清洗至少需要2天。系统在15分钟内完成了全部清洗和校验,只发现了12处数据错误(商品价格漏填),运营快速修正后,所有商品顺利上架。


十、总结:让数据清洗自动化

店群运营中,Excel数据处理是高频、重复、低价值的劳动。自动化不仅能释放人力,还能大幅降低出错率。

我们的经验:

  1. 先解决列名映射:这是最大的痛点,模糊匹配+人工确认很实用
  2. 数据类型转换要鲁棒:处理各种脏格式,宁可返回None也不要崩溃
  3. 校验规则要可配置:不同供应商不同要求,运营自己调
  4. 保留原始文件:方便追溯问题和重新清洗

不用一开始做很复杂的智能匹配。从最简单的关键词映射开始,逐步加入模糊匹配和机器学习。投入产出比极高。

作者:林焱

0
0
0
0
评论
未登录
暂无评论