地址裡有逗號、雙引號或換行,CSV 為什麼會整列錯位?

地址或配送備註可以含逗號、雙引號與換行,CSV 並不是一看到逗號就一定要拆欄。正確作法是由匯出程式依 CSV 規則引用欄位:含逗號或換行的欄位放在雙引號中,欄位內原有的雙引號用兩個雙引號表示。不要為了「修 CSV」把地址與備註的標點全部刪掉。
看懂一筆錯位資料
假設欄位是 id,address,note,虛構地址為「No. 8, Learning Rd.」,備註是兩行「請交管理室/抵達前聯絡」。正確輸出會把含逗號與換行的欄位完整包住。若匯出程式漏了引用,Excel 可能把地址拆成兩欄,甚至把備註第二行當成下一筆紀錄。
| 症狀 | 不要做 | 正確處理 |
|---|---|---|
| 每列欄數不同 | 手動把多的格合回去 | 回到匯出端修正引用 |
| 雙引號消失一半 | 全域刪除雙引號 | 依規則將欄內引號加倍 |
| 備註換行變成新紀錄 | 刪掉所有換行 | 讓整個欄位被雙引號包住 |
| 英文地址逗號造成拆欄 | 把地址逗號拿掉 | 正確引用地址欄 |
從來源到讀回的驗收
- 先確認預期欄名與每列欄數,例如固定三欄。
- 建立包含逗號、雙引號、換行與一般中文地址的虛構測試列。
- 用目標系統的正式匯出方式產生 CSV,不要手工拼接字串。
- 分別以純文字檢視與 Excel「從文字/CSV」預覽。
- 確認測試列仍是一筆資料、三個欄位,換行留在同一儲存格。
- 統計匯出前資料列數與讀回列數;只要不同就停止交付。
- 把錯位列列入「錯誤」,不要讓後續地址工具處理被拆碎的文字。
RFC 4180 記錄的是常見 CSV 格式與媒體型別,實際系統仍可能採不同分隔符號或解析方式。因此交付前要用真正的接收程式測試,不能只因 Excel 能打開就判定相容。
地址欄重新讀回正常後,可用批次地址整理工具處理純地址內容;備註、姓名與電話要留在其他欄。大量名單的原始欄與工作欄安排見Excel 地址批次整理指南,疑似重複列則依重複地址名單清理人工判斷。CSV 結構正確只代表欄位沒有錯位,不代表地址存在或可投遞。
三個字元要分別測
逗號測的是欄位邊界,雙引號測的是轉義,換行測的是紀錄邊界。測試檔應各準備單獨案例,再準備三者同時出現的組合案例。只用一般中文地址做測試,即使成功也無法證明備註含換行時不會拆列。
例如 note 欄原文是「門口標示"青禾",請先按鈴」並含一個換行,匯出後應由 CSV 函式正確引用;不要手動在字串前後加引號,否則既有引號可能只處理一半。產生檔後以 RFC 4180 相容解析器讀回,逐欄比較原始字串,而不是只看檔案外觀。
驗收要比對欄數、列數與內容
先確認每列解析後欄數等於標題欄數,再確認資料列數與來源相同,最後對含特殊字元的欄做逐字比對。Excel 顯示成多行儲存格可能是正常結果;真正的錯誤是換行變成另一筆紀錄或後續欄位整體位移。
若接收系統不支援欄內換行,應在資料契約中決定替代方式,例如另建配送備註欄或使用受控空白,不可在沒有紀錄的情況下刪除。地址原文與備註也要分欄,避免為修正 CSV 而改變收件地址本體。
不要用試算表畫面判斷原始 CSV
畫面可能自動隱藏引用符號或把欄內換行顯示成多行,這不表示檔案錯誤。驗收應比較解析後值與來源值,必要時查看純文字副本。反過來,畫面看似正常也可能已吞掉一個雙引號;只有逐字讀回才能發現。