去年替一个做服装的朋友整理上架表,需求特别简单:他有 5 个颜色、4 个尺码,要一行一个 SKU 列出来,再加一列材质共 3 种。我在 Excel 里手工做,第一版 20 行的时候花了将近一小时,扩到 60 行的时候我发现自己漏了一个颜色配最小码的组合,还重复了两行。检查比再做一遍还费时间。那次之后我才把"列出所有组合"当成一类需要工具处理的活,而不是靠细心就能对付的体力活。
组合的行数是相乘,不是相加
这是最容易判断失误的地方。5 个颜色和 4 个尺码,输入只有 9 项,出来是 20 行;再把 3 种材质并进去,输入变成 12 项,行数却变成 60。我一开始是按"加了三项,多几行吧"来估工作量的,这个直觉在多维组合上完全不成立。
| 维度构成 | 组合行数 | 要填满的单元格数 | 我手工做花多久 |
|---|---|---|---|
| 5 色 × 4 码 | 20 | 40 | 将近一小时,两处笔误 |
| 5 色 × 4 码 × 3 材质 | 60 | 180 | 漏一组、重两行 |
| 再加 2 种包装方式 | 120 | 480 | 没试过,认定会出错 |
| 8 色 × 6 码 × 4 材质 × 2 版本 | 384 | 1536 | 不现实 |
| 12 城市 × 25 产品 × 4 渠道 | 1200 | 3600 | 不现实 |
| 再乘 3 个年份 | 3600 | 14400 | 先想想要不要这张表 |
单元格那列是按行数乘维数算的:60 行乘 3 列是 180 格,3600 行乘 4 列是 14400 格。如果每个维度都是 10 项,两维 100 行、三维 1000 行、四维 10000 行,每加一维就是乘十倍。所以我现在的习惯是先算乘积再决定做不做——超过几千行我会先回去问一句:这真的需要全组合,还是只需要其中合理的那部分。
一次吃两组,多维就一轮一轮加
文本分列与合并 的笛卡尔积是给两组文本列表用的,一次把两组的每一对组合列出来。三个以上维度我的做法是分轮:第一轮把 5 个颜色和 4 个尺码放进去,出来 20 行;把这 20 行整块当作左边的输入,再和 3 个材质跑一轮,得到 60 行;要加第四维就再来一轮,60 行配上 2 种包装是 120 行。
这么分轮有个好处我后来才意识到:每一轮的中间结果我都能看懂、能抽查。真出一千多行时我会在每一轮结束核一次行数——上一轮行数乘这一组的项数,必须正好等于本轮行数。20 乘 3 应该得 60,出来 55 就说明某一组里少了一项或者夹了空行。
分隔符方面,两列拼成一行时我会用制表符或直接逗号,因为下一步往往要粘进表格软件。列与列之间用逗号,而每一列内部绝对不能出现逗号,这是我踩过的另一个坑,下面会说。
分列最容易错的地方:字段数比分隔符多一个
这工具还能按 Tab、逗号、空格或自定义分隔符把每行拆开,并选择保留指定列。我从 CSV 里取列时踩过的是段数问题:一行里有 5 个逗号会切出 6 段,如果结尾手滑多打了一个逗号,就多出一个空字段,后面的列号全部错位。我取"单价"这一列时以为拿的是第 4 段,实际因为中间一个字段带了逗号被切成两段,整行右移了一位。
所以取列之前我会先看第一行有几段、最后一行有几段,段数一致才敢往下做。字段内容里本身含分隔符的,要么换分隔符,要么先清洗,别指望切错了再靠肉眼看出来。
按空格切是我另一次翻车。数据里有一列是"城市 区"这种两个词拼起来的地址简写,我按空格分列,一行凭空多出两三段,列号全乱。同一份数据里还有"上海市 浦东新区"和"上海 浦东新区"两种写法,切出来的段数就不一致。这类情况我改成用一个内容里绝不会出现的串来做分隔符,重导一遍再切,而不是在切的时候侥幸。
切完只保留需要的那几列,是这个功能真正省时间的地方。一份十几列的导出,我要的常常只有 SKU、颜色、尺码三列,把这三列选出来之后,剩下的宽度才够拿去和别的清单交叉。段数对不上的那些行我会单独拎出来看,而不是让它们混在结果里——分列出错的表现通常不是报错,而是给你一列看起来像但意思全歪的东西。
生成之后我固定做两件事
第一是去重。多维里很容易出现语义重复的行,比如同一个颜色和尺码来自两处不同清单。我用 文本排序去重 排一遍,顺便把重复项揪出来——重复不是小问题,它是上架表里的重复 SKU,会直接和后台撞。第二是补格式。组合表出来是裸的值,我通常还要给每行统一加上前缀或序号,这一步交给 文本行操作 做批量加前后缀,比自己拽填充柄快,也不会有拖漏的那几行。
参数组合做测试用例时,我还会再多做一步:先确认是否真要全组合。四个参数各 5 个取值是 625 条用例,而两两组合覆盖往往就够发现问题——这属于取舍,不是工具能替你决定的。
常见问题
Q:两个列表行数不一样,能合并吗?
按行合并时我不这么干。行数不同意味着两边不是同一个体量的数据,硬合会出现某行只有一半。要交叉全部组合,那是笛卡尔积的活,和按行合并不是一件事。
Q:组合出来 1200 行,我怎么确认没漏?
用乘法核对。上一轮的行数乘以本轮的项数必须等于结果行数,再顺手确认结果里不同颜色各占多少行——1200 行里 12 个城市应当每个出现 100 次,某城市只有 95 次就是漏了。
Q:Excel 里的复制粘贴不能做这个吗?
两维 20 行是可以的,我手工做过,代价是一小时和两处笔误。三维往上就得靠嵌套粘贴,出错以后你没法定位是哪一层漏的。我的界线是三维或超过 60 行就交给工具。
Q:分隔符选逗号还是 Tab?
看内容里有没有逗号。颜色名、渠道名这类经常自带逗号或空格,遇到这种情况我用 Tab,或者自定义一个内容里绝对不会出现的串。分隔符选错,切出来的列会整排错位。
那张服装上架表最后是这么交的:颜色和尺码先出 20 行,配材质出 60 行,包装加完 120 行,每轮都做了行数相乘的核对,再去重排序。手工那一小时换来的是两处笔误,工具那几分钟换来的是能验证的行数关系——这也是我现在判断"要不要手工做"的依据:只要结果无法用一个乘法核对,就不该手工做。