CSV 還是 Excel 做流程圖:該由哪一種檔案建起

CSV 是一張純文字表格,沒有公式、沒有第二個工作表、沒有格式。Excel 三樣都有,而且很少是系統匯出的東西。該由哪一種格式建流程圖,以及各自要你付出甚麼。

要人手準備一條流程,Excel 是較好的地方;而系統真正遞給你的那個檔案,通常是 CSV。兩者都變得成流程圖,但它們壞在不同的位置,而知道自己手上拿著哪一種,決定了你首先要檢查甚麼。

簡而言之

  • CSV 是一張純文字表格:沒有公式、沒有第二個工作表、沒有格式,也沒有東西要重新計算。
  • CSV 不會宣告自己的分隔符。逗號、分號與定位字元都在流通,而檔案看上去一模一樣。
  • 前置零在檔案裡活得下來,卻死在檢視器手上——00742 完好無缺,直到 Excel 打開這個 CSV 並存回去。
  • Excel 保住類型與公式,但一條公式在成為一個方框之時已經是一個值,而 .xlsx 很少是系統匯出的東西。
  • 兩者匯入方式相同:把檔案拖到試算表區域或者把那些列貼進去,而比對的是標題名稱,不是欄的次序。

每一種格式承載得到與承載不到甚麼

這兩種格式不是同一件事的兩個版本。一個 CSV 是一個文字檔:一張表格、一列一行、欄位之間有一個分隔符、任何含有那個分隔符的欄位用引號包起。裡面再沒有別的——沒有公式、沒有儲存格類型、沒有第二個分頁、沒有顏色、沒有欄寬。一個 .xlsx 是一包壓縮起來的 XML,上述一切它都帶著,這正是為甚麼它是人手草擬一條流程較好的地方,也正是為甚麼幾乎沒有系統會吐出一個。向一套 ERP、一個 PIM、一個工單工具或者一個資料庫要你的流程資料,回來的是一個 .csv。

一張流程圖所需要的,比任何一種格式提供的都少。一個方框一列、一個標籤、每一列所連往那幾個列號、按對應次序排列的連線標籤,以及選填的一個形狀與兩個泳道欄。整個要求就是這樣,而它全部都是文字。Excel 額外加上去的一切,在變成一個方框之前無論如何都要先解析成一個值:一條公式變成它算出來的數字,一次對另一個工作表的查找變成它傳回的字串,一個條件式格式甚麼都不變成。如果你想看完整的要求,/yue/guides/流程圖csv檔案結構 列出了那些欄;這一頁只講那個容器。

所以誠實的比較,是看每一個容器要你付出甚麼。CSV 要你付出一個檔案從不宣告的分隔符——在美國是逗號,在歐洲大部分地方是分號,而定位字元也常見到不能忽視——再加一個只是有時候才是 UTF-8、有時候還在第一個標題名稱前面帶著一個位元組順序標記的編碼。它沒有類型,所以一個產品代碼與一個數量看上去一模一樣,而 Excel 一打開這個檔案就會去猜:00742 變成 742,3-4 變成一個日期,一個很長的 SKU 變成科學記數法。Excel 要你付出的是相反的一組。它是一團你沒法比對、沒法搜尋的二進位資料,它招來合併儲存格、兩行標題與把顏色當資料用,而且交到你手上的那個檔案,通常已經不是系統產生的那一個——有人打開了那份匯出並儲存過,而一個 CSV 大部分的損害正是在那裡發生的。

下面的示例是一份產品目錄拆解,正是那種只會以 CSV 形式到埗的父子匯出檔。十九列、一個父欄留空的根、五個目錄真正分岔的判斷、七片葉。看住這個走查一次填一個欄,並留意哪些階段在 Excel 裡會容易一些,而哪些階段根本沒有分別;範本本身在 /yue/templates/csv父子層級。

一份 CSV 匯出檔一個欄一個欄地變成一張圖

一份產品目錄匯出檔的四個完成度階段。打開試算表面板,看看每個階段填的是哪一個欄。

  1. 匯出檔給了你甚麼

    一份 PIM 匯出檔到埗時是一堆名稱加一個類型欄,不是一堆箭嘴。這裡頭四列是「戶外生活目錄」、「座椅」、「遮陽與遮蔽」,以及問題「這個類別是否再往下分層?」。填好的只有「形狀」,而「形狀」正是一個 CSV 通常已經透過它的類型欄或者層級欄暗示了的那一個欄——這個階段在兩種格式裡都不用你付出甚麼。

  2. 把父欄反轉成「連線至」

    匯出檔說的是每一列的父;「連線至」說的是每一列的子,以列號表示。「戶外生活目錄」現在放著「2,3」,箭嘴就出現了。這是 Excel 真正會縮短的一個階段,因為把一個父代碼解析成一個列號是一次查找——而這也正是一個逗號分隔檔案需要把那個儲存格用雙引號包起、否則那一列會多出一個欄位的階段。

  3. 在「連線文字」為分支加上標籤

    「這件產品是否有款式?」取「是——一個款式一列」與「否——產品那一列就是 SKU」,按位置與它那兩個「連線至」數字 11 與 12 配對。留意那些破折號。一個標籤裡的半形逗號不是一個你加引號就解決得到的問題——「連線文字」是在 CSV 的引號脫去之後才按逗號拆開的,所以一個含有它的標籤會變成兩個標籤,與「連線至」的配對隨即移位。Excel 也不會就此警告你;這是那個欄的性質,不是那個檔案格式的性質。

  4. 加上泳道欄

    「橫向泳道」承載沿父鏈往上走所得的深度,由根(父欄留空)到深度 4,而「縱向泳道」承載匯出檔自己的類型欄:類別紀錄、產品紀錄、款式紀錄、元件紀錄。類型本來就在檔案裡,而深度要推導出來,這就是整個分野的縮影——系統給了你的資料,對你要計算的資料。匯入之後再沒有東西要重新計算,所以那個優勢也就不再要緊。

運作方式

  1. 弄清楚你實際上拿著哪一種檔案

    如果這條流程是由一套系統出來的,那麼無論圖示長成怎樣,你拿著的都是一個 CSV,而你可以對它做的最安全的事,就是不要用 Excel 打開它。如果是有人人手打出來的,你拿著的是一個活頁簿,而它裡面會有合併儲存格。兩個起點需要不同的第一步,而把一份匯出當成一個活頁簿去對待,正是令你的產品代碼變成日期的原因。

  2. 在試算表之前先用文字編輯器打開這個 CSV

    看頭兩行。它們告訴你分隔符、那些欄位有沒有加引號,以及第一個標題名稱前面有沒有三個由 UTF-8 位元組順序標記帶來的隱形位元組。在這裡花三十秒,省下兩個看似軟件錯誤而其實不是的失敗:一個匯入成一個巨大單欄的檔案,以及一個因為標題再也比對不上而被安靜忽略的第一個欄。

  3. 如果你的來源是 Excel,就把它攤平成一張表格

    把工作表以值的方式貼回它自己身上,令每一條公式都變成它算出來的字串。把所有合併取消,刪掉標題上方那一塊、刪掉空白分隔列,並把任何以填色或粗體編碼的東西搬進一個真正的欄,因為它們沒有一樣捱得過這一趟。一行標題、一個步驟一列、一個工作表。CSV 按定義就是一張表格,所以這一步正是令兩個來源等價的那一步。

  4. 把連接欄以列號加上去

    「連線至」放的是每一列所連往那一列以 1 起計的號碼,多過一個時以逗號分隔,而「連線文字」按同一次序放連線標籤。在一個逗號分隔的檔案裡,兩個儲存格都必須用引號包起——「5,6」與「是,否」——否則那一列就會比標題多出一個欄位,而它後面每一個欄都往左移。這是在兩種格式裡你都真正要自己提供的唯一一批新資料。

  5. 把它匯入

    把 .csv 拖到編輯器的試算表區域,或者直接把 CSV 文字貼進去。欄是按標題名稱比對的,所以它們在你檔案裡的次序無關緊要,而任何不獲認得的東西都會被帶過並忽略。由一個活頁簿出發的話,要麼選取那個範圍貼進去,要麼先把工作表另存為 CSV——當那張工作表裡有任何不尋常的東西時,後者值得做,因為另存為 CSV 會把真正捱得過的東西給你看。

  6. 檢查那三件只會朝一個方向壞的事

    掉了一個前置零的代碼、變成了日期的值,以及在檔案中間某處移了位的一個欄。三者都來自一個 CSV 被某個會猜的東西解析過,而三者在你去找之前都是隱形的。在那些列裡修好它們,不要在原本的匯出檔裡修,因為由這一刻起圖表是母版,而那個檔案是一個快照。

應避免的錯誤

  • 用 Excel 打開匯出檔「檢查一下」

    Excel 一打開就解析,而且會把它解析出來的東西存起。00742 回來時是 742,3-4 回來時是一個日期,一個十六位的代碼回來時是科學記數法,而原本那些值已經從檔案裡消失了。如果你非看不可,就用文字編輯器看,或者以文字方式匯入。

  • 假設分隔符是逗號

    大部分歐洲系統的匯出檔是分號分隔的,而一個定位字元分隔的檔案經常以 .csv 為名到埗。檔案裡沒有任何東西宣告它是哪一種。一整份匯出落進單獨一個欄,代表分隔符猜錯了,不代表這個檔案壞了。

  • 由格式承載的意義

    粗體代表判斷、黃色代表例外路徑、一個橫跨一個階段的合併儲存格。這是一個只屬於 Excel 的習慣,而 CSV 會把它們全部刪掉,連一句警告都沒有。任何承載意義的東西,都必須在匯出之前先變成一個欄——「形狀」、「連線文字」,或者一條泳道。

  • 匯出了錯的工作表

    一個活頁簿把步驟放在一個分頁,把負責人清單或者代碼查找表放在另一個,而 CSV 只取一張表格。先把那些查找解析成值,然後匯出放著步驟的那個分頁。當你收窄到單一一張表格之後,那兩個連接欄需要甚麼,見 /yue/guides/在csv裡定義連接。

把你的 CSV 匯入成流程圖

把這個目錄示例作為你自己的圖表打開,看看那些欄是怎樣填的,然後把你自己的匯出檔貼上去覆蓋那些列。

把你的 CSV 匯入成流程圖

相關指南

常見問題

要做流程圖,我應該匯出 CSV 還是 XLSX?

取來源系統本來就產生的那一種,實務上即是 CSV。把一份匯出轉成一個活頁簿,只是加了一個解析環節,而那個環節只可能損失資訊;至於你會換來的那些活頁簿功能——公式、類型、第二個工作表——全部都要在一列變成一個方框之前解析成純值。有一種情況 Excel 是較好的選擇:當這條流程還未存在於任何地方、而你正在人手把它寫出來時,因為一條把步驟代碼變成列號的公式,確實比人手做快。那條路在 /yue/guides/從試算表建立流程圖 有交代。那些列一旦定下來,兩種格式就完全匯合。

CSV 會不會漏掉流程圖真正需要的東西?

不會。一張圖建起來所用的每一個欄都是文字:標籤、「連線至」裡的列號、「連線文字」裡的連線標籤、形狀名稱,以及兩個泳道名稱。當中沒有一樣需要類型、公式或者第二個工作表,所以一個 CSV 承載得起一張完整的流程圖,一點不缺。CSV 會漏掉的是圖以外的一切——格式、一則註解裡的備註、下一個分頁上的樞紐分析、那個由計算而不是由儲存得來的欄。如果當中有任何一項對你的流程是承重的,那它就是一份被編碼在資料以外的意義,而它必須在匯出之前而不是之後變成一個欄。

為甚麼我打開那個檔案之後,產品代碼變了樣?

因為一個 CSV 沒有類型,而打開它的那個程式必須去猜。一個讀作 00742 的欄位在檔案裡就只是那五個字元;Excel 把它讀成一個數字、掉了前置零、顯示 742,而如果你在那一刻儲存,這個檔案本身現在就寫著 742。同一個猜測把 3-4 變成一個日期、把一個長數字代碼變成科學記數法,並按打開它那個人的地區設定去重新解讀 01/02。這個檔案在被檢視之前一直都是正確的。請直接匯入這個 CSV,不要讓它在一個試算表裡走一轉;如果你非打開不可,就把那些欄以文字方式匯入。

當幾個人一起維護這條流程時,哪一種格式較好?

只要這條流程還住在一個檔案裡,就是 CSV。它是純文字,所以它逐行比對得到、搜尋得到、合併得到,也可以放進版本控制,清清楚楚顯示兩個修訂之間哪些步驟改動過。一個 .xlsx 是一包 XML 的壓縮檔:改一個儲存格會重寫大半個封存檔,所以一次比對只會告訴你這個檔案變了,此外甚麼都沒有。話雖如此,匯入之後這個答案就不再要緊,因為圖表變成了母版,而它自己的修訂紀錄接手。把那個 CSV 留作一份大家也會去編輯的並行副本,只會把這次轉換本來要終結的偏差重新引入。

我的欄在一行中間移了位。發生了甚麼事?

幾乎一定是一個逗號分隔檔案裡一個沒有引號保護的逗號。那一行是在任何東西看標題之前就按分隔符拆開的,所以一個含有 4,5 的「連線至」儲存格會被讀成兩個欄位,那一列於是比標題多出一個欄位,而它後面每一個欄都落在鄰居的標題之下。把那些儲存格用雙引號包起,解析器就會把它們放回原位。同樣道理適用於「連線文字」,以及任何含有半形逗號的標籤,例如一個產品名稱。如果移位是由最第一個欄而不是由中間開始,成因就不同了:這個檔案是分號分隔的而被當成逗號分隔去讀,或者有一個位元組順序標記附在第一個標題名稱上,令它再也比對不上。

本指南所用的範本

CSV 父子層級範本(產品目錄拆解) — PIM 或 BOM 匯出檔在每一列指名它的父項,所以箭嘴向上指。「連線至」欄指名子項,所以箭嘴向下指。這份範本就是把這次反轉畫出來:五個深度層級、五個判斷、七片葉。

Browse all Excel 、 CSV 、 Visio 同埋數據驅動圖表指南

產品目錄拆解(PIM 或 BOM 匯出檔,由父到子): 根(父欄留空) → 深度 1 → 深度 2 → 深度 3 → 深度 4
CSV 還是 Excel 做流程圖:該由哪一種檔案建起