切換語言為:簡體

如何解決 JavaScript 匯出 CSV 檔案不完整的問題

  • 爱糖宝
  • 2024-06-14
  • 2099
  • 0
  • 0

在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"

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.