資料格式與結構化資料
CSV 欄位錯位,如何檢查引號與換行?
使用工具
兩欄匯出後變三欄,某筆紀錄像是溢出到下一行。別立即刪逗號或換行,它們可能屬於地址或備註。引號決定逗號是分隔符還是資料。
用 CSV 編輯器表格和 JSON/CSV 轉換檢查各值落在哪個儲存格。範例是虛構 UTF-8 資料,亂碼應先單獨檢查編碼。目標是正確讀取邊界,而非修改值來美化原文。
把地址逗號保留在一個儲存格
id,address
001,North, Building A表頭兩欄,資料列卻有兩個逗號,按逗號解析會出現欄數不符。Building A 不一定是第三欄;若整個地址是一個值,應給完整值加雙引號,不要默默丟棄多餘欄。
id,address
001,"North, Building A"表格應顯示兩個值 001 與 North, Building A,地址不含邊界引號。轉換 JSON 可確認 001 仍是字串,但其他試算表可能推斷為數字,下一步仍需檢查欄型別。
看似三行,也可能只有一筆紀錄
id,note
001,"first line
second line"這是表頭加一筆資料,note 的引號跨越實體換行,兩行屬於同一儲存格。表格顯示一個備註,JSON 在字串中表示換行。原始碼行數不等於紀錄數。
去重行、刪空行可能刪掉引號內備註的一部分。操作 CSV 應先按紀錄解析,不應照搬逐行日誌處理。若接收端不允許值內換行,需先約定替換規則並說明值會改變。
值內的引號寫成兩個引號
id,name
001,"Notebook ""mini"""name 應顯示 Notebook "mini"。外層引號界定欄位,內部連續兩個引號代表一個字面引號。JSON 的反斜線寫法不能直接代替 CSV 引號規則,應區分目標值與各格式表示。
全部加引號會改變簡單值的原始碼外觀。重新解析後儲存格相同,就只是表示變化。原始碼不同不一定遺失資料,字面引號消失才是值變化,應比較解析後的值。
全部擠成一欄時檢查分隔符
id;amount
001;12.50按逗號讀取時 id;amount 可能成為一個表頭。改為分號後應分成兩欄。能解析成一欄不證明正確,應核對名稱、欄數與首末紀錄,不要全域替換值內標點來彌補錯誤設定。
編輯器按所選分隔符解釋輸入,不要假設有獨立的輸入/輸出分隔符控制。先正確解析,必要時經 JSON 檢查值。小數逗號與欄位分隔符是不同角色。
檢查空值、零與類似公式的文字
空儲存格不等於明確的零,CSV 也可能無法保留空字串與 JSON null 的區別。把空值都改為 0 會改變缺漏含義。型別和缺漏規則由雙方約定,不應在修引號時自行補定義。
交給試算表前檢查 = 等開頭文字。公式中和會給值加前綴,資料因此改變。給人閱讀的表格與給程式保留原值的匯出應區分;CSV 加引號並非通用防公式執行措施。
保留地址逗號、多行備註、帶引號名稱、前導零 ID 的小樣本,並註明紀錄數與儲存格預期值。兩三筆虛構紀錄通常足以重現正式匯入問題,也能減少分享資訊。