先問這一欄要算數 還是要一字不差
站點 000123 被匯入成 123,看起來只少了幾個零,卻可能再也對不上設備清單。長批次號被轉成數字後,末位還可能失真。保護方式要放在匯入之前:識別碼當文字,真正要加減乘除的量測當數值,原始 CSV 留一份不覆寫。
這篇用兩筆虛構生產資料練習。station 為固定六碼站點,batch_id 為十八碼批次識別碼,quantity 是數量,temperature 是攝氏溫度。識別碼的任一字元都具有比對意義;即使只包含 0~9,也不代表它應用數值型別。不要拿 batch_id 計算平均,也不要為了所有欄位都看起來一致,將溫度一起保留成無法計算的文字。
| 欄位 | 原始文字 | 匯入型別 | 理由 |
|---|---|---|---|
| station | 000123 | 文字 | 六碼識別;前導零不可省略 |
| batch_id | 123456789012345678 | 文字 | 十八碼識別;末位也要保存 |
| quantity | 24 | 整數 | 可累加的件數 |
| temperature | 25.3 | 小數 | 可計算的工程值 |
CSV 本身沒有像活頁簿那樣保存儲存格格式。你能在檔案裡保存字元,卻不能靠它強迫所有試算表採同一種型別。把「欄位字典+匯入步驟」與 CSV 一起交付,才能讓接手的人得到相同結果。
引號可以保護欄位邊界 不能保證保護型別
先看這份合成資料。第一列使用引號包住識別碼,第二列不加引號。符合 CSV 語法的解析器會把第一列的引號視為欄位語法,不把它當 station 的一部分;後續若再自動推測成數值,000123 仍可能變成 123。
station,batch_id,quantity,temperature
"000123","123456789012345678",24,25.3
000124,123456789012345679,30,26.1
對資料接收端,請明訂 station 與 batch_id 為文字,而不是只說「已加雙引號」。RFC 4180 的引號規則處理逗號、換行與雙引號等欄位內容,不會為 Excel 建立文字型別宣告。反過來說,正確 CSV 解析後也不要把外層雙引號算進站號長度。
| 處理方式 | 看似成功的地方 | 仍有的問題 |
|---|---|---|
| 只加雙引號 | CSV 欄位結構正確 | 匯入器仍可能自動轉數值 |
| 套用 000000 顯示格式 | 123 看起來變 000123 | 底層仍為數值;只在已知固定六碼才可補顯示 |
| 轉型後改文字格式 | 儲存格顯示文字格式 | 已遺失的原始字元不會自動還原 |
| 匯入前指定文字 | 保留識別碼字元 | 仍需驗證長度、值與讀回結果 |
不要自行在 CSV 識別碼前加單引號,或改寫成等號公式。這會改變交換資料,其他系統可能把額外字元當真實代碼。Excel 手動輸入的前置單引號行為,不等於每個 CSV 接收端都理解相同慣例。
用 Excel 明確匯入 不讓它先猜完再補救
以支援 Power Query 的桌面版 Excel 為例,從「資料」的「從文字/CSV」匯入,在預覽中選擇轉換資料。若介面提供型別偵測選項,可先選不要自動偵測;進入查詢編輯器後,確認 station 與 batch_id 為文字,再個別設定 quantity 和 temperature。不同版本的按鈕名稱略有差異,重點是轉型發生前就指定識別碼型別。
複製原始 CSV 為練習檔,保留原檔與欄位字典;以文字編輯器確認站點六碼、批次十八碼。
匯入時明確選編碼與逗號分隔。預覽應有四欄,標題不應跑進第一筆資料。
檢查「套用的步驟」是否已有自動「變更類型」。若識別碼已被轉數值,移除或修改該步驟,回到原始文字,再將識別欄設為文字。
設定量測與數量欄型別,必要時指定小數點地區設定。載入到新活頁簿,確認數值欄可計算、識別欄完整。
儲存分析活頁簿為 XLSX;需要再交換 CSV 時另存新檔,最後用明確型別重新匯入驗證。
若使用舊版文字匯入精靈,在欄位資料格式階段逐欄指定文字。若版本支援自動資料轉換設定,也可調整預設,但這不能代替交付規則;另一台電腦可能用不同預設。請把你採用的匯入方式記錄下來,而不是只說「在我電腦看起來正常」。
長整數一旦失真 就回原檔重新匯入
Excel 數值精度最多為 15 位有效數字。十八碼批次號若被當成數字,後面位數可能被改成零;把欄寬拉大只會顯示已轉換的結果,不能找回資料。本例兩個批次僅最後一碼不同,這正是測試自動轉換會不會合併識別碼的好案例。
| 檢查點 | 第一筆應得到 | 第二筆應得到 |
|---|---|---|
| 站點字元長度 | 6 | 6 |
| 站點完整值 | 000123 | 000124 |
| 批次字元長度 | 18 | 18 |
| 批次末三碼 | 678 | 679 |
| 識別碼相等比對 | 兩批次必須不同 | 不能轉型成相同值 |
驗證不能只看長度:123456789012345000 也有十八碼。要以文字逐字比對完整 batch_id,再檢查兩筆是否仍不同。若任何一碼不符,回到保留的原始檔重新匯入;不要憑上一批號推算尾碼,也不要從四捨五入後的數字猜回原始值。
前導零也要分兩種情況。若資料字典明訂六碼,123 可以按規則補成 000123 作為修復候選,但仍需對原檔核對;若代碼可變長,123、0123、000123 可能是不同設備,不能擅自補成同一碼。顯示漂亮和身分正確,是兩個獨立的驗收項目。
完成後用原始檔和分析副本做一次往返比對
完成後應看到四欄、兩筆資料,兩個站點均保留六碼,兩個批次均保留十八碼且彼此不同;quantity 合計為 54,temperature 仍可作數值運算。最後一項能防止你把全部欄位都改文字後,誤以為整份資料已處理好。
| 失敗現象 | 第一個檢查位置 |
|---|---|
| 000123 變 123 | 是否直接開啟或自動轉數值;回原始來源步驟 |
| 批次末位變零 | 是否超過15位仍用了數值型別 |
| 畫面正確 再匯入又錯 | 新的CSV不含型別;接收端是否仍用自動偵測 |
| quantity 無法相加 | 數量是否也被留成文字或混入單位 |
| 欄位合成一欄 | 分隔符、編碼或引號解析設定 |
常見問題
加引號後還會失去前導零嗎?可能。引號是 CSV 欄位語法;接收端仍須把這欄指定為文字。
科學記號一定表示資料已壞嗎?不一定,可能只是顯示方式。先看原始字元與底層值;但識別碼若曾經被轉成超過精度的數字,就應回原檔核對。
用自訂格式補零可以交差嗎?只在明確固定長度的顯示需求下適用。識別碼交換還須驗證底層字元及再次匯出結果,不能只看畫面。
適用型號與限制:本文以桌面 Excel 的明確型別匯入流程說明,並不指定 PLC 的 SD 卡匯出指令。Excel 網頁版、Mac 或其他試算表的匯入介面與轉型預設可能不同;請按實際版本做兩筆案例驗收。
參考:Microsoft Support Keeping leading zeros and large numbers 適用版本及 15 位精度說明
參考:Microsoft Support Text Import Wizard 欄位資料格式
參考:Microsoft Power Query Text/CSV connector 型別偵測