去年替一個做服飾的朋友整理上架表,需求特別簡單:他有 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 行,每輪都做了行數相乘的核對,再去重排序。手工那一小時換來的是兩處筆誤,工具那幾分鐘換來的是能驗證的行數關係——這也是我現在判斷「要不要手工做」的依據:只要結果無法用一個乘法核對,就不該手工做。