在JavaScript中處理CSV檔案時,需要特別注意一些特殊字元,例如逗號、雙引號、換行符等。這些字元可能會影響CSV檔案的解析,導致資料錯亂。
1. 逗號 (,
)
逗號是CSV檔案預設的列分隔符。如果資料欄位中包含逗號,需要將該欄位用雙引號包圍起來。
const data = ['Hello, world', 'Example']; const csv = data.map(item => `"${item}"`).join(','); console.log(csv); // "Hello, world","Example"
2. 雙引號 ("
)
雙引號用於包圍包含特殊字元的欄位。如果欄位內容中包含雙引號,需要將其替換為兩個連續的雙引號 (""
)。
const data = ['He said "Hello"', 'Example']; const csv = data.map(item => `"${item.replace(/"/g, '""')}"`).join(','); console.log(csv); // "He said ""Hello""","Example"
3. 換行符 (\n
) 和回車符 (\r
)
換行符和回車符分別表示換行。如果資料欄位中包含換行符或回車符,需要將該欄位用雙引號包圍起來。
const data = ['First line\nSecond line', 'Example']; const csv = data.map(item => `"${item}"`).join(','); console.log(csv); // "First line\nSecond line","Example"
4. 製表符 (\t
)
製表符在CSV檔案中通常不會被識別為列分隔符。但是,如果CSV檔案使用製表符作為分隔符,那麼我們就需要將資料欄位中的製表符替換為其他字元,或者將包含製表符的欄位用雙引號包圍起來。
const data = ['Column1\tColumn2', 'Example']; const csv = data.map(item => `"${item}"`).join(','); console.log(csv); // "Column1\tColumn2","Example"
5. 特殊控制字元
控制字元是指一些非列印字元,例如退格符 (\b
)、換頁符 (\f
) 等。在處理CSV檔案時,需要確保正確處理這些特殊控制字元,避免解析錯誤。
const data = ['Line1\fLine2', 'Example']; const csv = data.map(item => `"${item}"`).join(','); console.log(csv); // "Line1\fLine2","Example"
6. 非ASCII字元
非ASCII字元是指 ASCII 碼錶中未定義的字元,例如中文、日文、韓文等。在處理包含非ASCII字元的CSV檔案時,需要確保使用正確的字元編碼。如果是中文建議使用UTF-8 BOM防止中文亂碼,只是使用utf-8依舊可能出現問題。
const data = ['你好', 'Example']; const csv = data.map(item => `"${item}"`).join(','); console.log(csv); // "你好","Example"
7. 井號 (#
)
在CSV檔案的標準內容中,井號通常沒有特殊意義,可以作為普通字元出現在資料欄位中。但是,一些應用程式或數據處理流程可能會對井號有特殊處理,例如將其視為註釋符號。
在Excel中,如果單元格內容因列寬不足無法完全顯示,會用井號(#######)來表示。這不是CSV檔案本身的問題,透過調整列寬即可解決。這也是要注意的地方。
程式碼示例:處理CSV中的特殊字元
最後給大家一段處理特殊字元的程式碼示例:
function escapeCsvField(field) { if (field.includes('"')) { field = field.replace(/"/g, '""'); } if (field.includes(',') || field.includes('\n') || field.includes('\r')) { field = `"${field}"`; } return field; } const data = [ ['Name', 'Message'], ['John Doe', 'Hello, "world"!'], ['Jane Doe', 'Line1\nLine2'] ]; const csv = data.map(row => row.map(escapeCsvField).join(',')).join('\n'); console.log(csv); // Name,Message // John Doe,"Hello, ""world""!" // Jane Doe,"Line1 // Line2"