博客 / 詳情

返回

正確處理 CSV 文件的引號和逗號

CSV(Comma-Separated Values,逗號分割值),就是用純文本的形式存儲表格數據,最大的特點就是方便。

作為開發,我們經常面臨導數據的問題,特別是後台系統,產品或者運營的同事常常會提需求。

Emmm,實話説,直接用 PHPExcel 也是 OK 的,不管是 WPS Office 或者微軟 Office,都能完美支持。

但我還是比較喜歡 CSV,原因是容易實現。有時候跑腳本、寫爬蟲抓數據,純文本拼接後輸出真的非常舒服。

當我遇到了幾個問題:

  • 發現如果原來的文本帶有回車或者換行,拼接後整行就斷開了;
  • 加引號可以解決,但是引號中間有引號怎麼辦?用 \ 轉義也不行;
  • 逗號怎麼辦?

於是翻了谷歌,看到維基百科有 逗號分隔值 的標準化定義:

  • 以(CR/LF)字符結束的DOS風格的行(最後一行可選)。
  • 一條可選的表頭記錄(沒有可靠的方式來檢測它是否存在,所以導入時必須謹慎)。
  • 每條記錄“應當”包含同樣數量的逗號分隔字段。
  • 任何字段都可以被包裹(用雙引號)。
  • 包含換行符、雙引號和/或逗號的字段應當被包裹。(否則,文件很可能不能被正確處理)。
  • 字段中的一個(雙)引號字符必須被表示為兩個(雙)引號字符。

好像也不難 :)

關鍵就是最後那兩點——不多説,直接看代碼:

function csv_string($s)
{
    return '"'. str_replace('"', '""', trim($s)) .'"';
}

$value1 = csv_string($value1);
$value2 = csv_string($value2);
$value3 = csv_string($value3);
$line   = "{$value1},{$value2},{$value3}\r\n";

簡單粗暴。


文章來源於本人博客,發佈於 2018-06-02,原文鏈接:https://imlht.com/archives/145/
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.