CSV 文件格式
描述
逗號分隔值(Comma-Separated Values,CSV,有時成為字符分隔值)。
其文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本),文件的每一行都是一個數(shù)據(jù)記錄。
每個記錄由一個或多個字段組成,用逗號分隔。使用逗號作為字段分隔符是此文件格式的名稱的來源,因為分隔字符也可以不是逗號,有時也稱為字符分隔值。
CSV 廣泛用于不同體系結(jié)構(gòu)的應(yīng)用程序之間交換數(shù)據(jù)表格信息,解決不兼容數(shù)據(jù)格式的互通問題。一般按照傳輸雙方既定標(biāo)準(zhǔn)進(jìn)行格式定義,而其本身并無明確格式標(biāo)準(zhǔn)。
特征
- 文件采用純文本存儲,需要使用某個字符集(ASCII、Unicode、UTF-8等)
- 數(shù)據(jù)由記錄組成(一般是每一行一條記錄)
- 每條記錄被分隔符分為一個個字段(常用的分隔符有
',','\t',' ',';'等)- 每條記錄都有同樣的字段序列
優(yōu)點
由于 CSV 文件格式的特性。
CSV 格式的文件可以用 Excel 和 WPS 等表格工具以表格的形式打開,便于查看和編輯。
缺點
由于 CSV 文件格式?jīng)]有嚴(yán)格的標(biāo)準(zhǔn)(實際上可以認(rèn)為沒有標(biāo)準(zhǔn)),會造成使用不同的工具打開時會有不同程度的亂碼問題。
(你本地的 Excel 和 WPS 打開同一個 CSV 文件,往往顯示的情況會不一樣。甚至同一個 Excel 軟件的不同版本,也會顯示不一樣的結(jié)果)
所以進(jìn)行一些約定很重要。
CSV 文件解析的關(guān)鍵點
字符集:由于文件是采用純文本存儲的,不同字符集對每個字符的存儲方式不一樣。需要統(tǒng)一采用一個字符集才能很好的進(jìn)行兼容。(關(guān)于常用的 ASCII、Unicode、UTF-8 字符集可以看一下這個ASCII、Unicode、UTF-8)
分隔符:一般常用的是 ','(逗號分隔符)。但是有些 CSV 文件需要存儲文章句子信息等,這些信息 ',' 符是常用字符,容易造成解析出錯或者解析方法復(fù)雜??梢赃x用 '^' / '\t' 等不常用的字符作為分隔符。應(yīng)用途而異,具體問題具體分析。
記錄分隔:一般來說以一行為一條記錄,那么記錄與記錄之間就是常用"換行符"進(jìn)行分隔的?這里就需要看一下附錄:回車符 CR 與換行符 LF 的行末結(jié)束符之爭。
空字段:我們常使用 CSV 文件當(dāng)做表格來處理,那么表格顯然存儲某些字段為空的情況。這種情況下需要注意保留兩個分隔符,表示一段空字段。
Excel 和 WPS 建議格式
Warning:個人測試結(jié)果,有問題不要打我?。。。y免有版本問題)
Warning:個人測試結(jié)果,有問題不要打我?。。。y免有版本問題)
Warning:個人測試結(jié)果,有問題不要打我?。。。y免有版本問題)
由于經(jīng)常使用的文字包含 英文 和 簡體中文,需要考慮一個合適的字符集:
| 信息 | 建議設(shè)置 | |||
|---|---|---|---|---|
| 字符集 | Unicode | |||
| 分隔符 |
','(逗號分隔符) |
|||
| 記錄分隔 | 這兩個軟件基本上是在 Windows 上使用的,那么需要采用 CRLF("\r\n") 作為行末分隔符 |
|||
| 其它 | 如果存儲在字段里有 ',' 符號,需要用 '"' 包含字段。如:`姓名 |
年齡,性別 | 地址,CSV 的記錄為:姓名,"年齡,性別",,地址CRLF` |
基本上滿足以上要求的,可以完美的用 Excel 和 WPS 打開查看和編輯和。
附錄:回車符 CR 與換行符 LF 的行末結(jié)束符之爭
在計算機出現(xiàn)之前,人們常用電傳打字機(Teletype Model 33)打印字符,它每秒可以打印 10 個字符(0.1 秒 / 字符)。
但在打印完一行后,準(zhǔn)備換行時發(fā)現(xiàn)換行需要用去 0.2 秒。
而這 0.2 秒正好可以打印兩個字符。
如果這 0.2 秒內(nèi)有新的字符傳過來,那么傳過來的字符將會丟失(因為它正在換行,無法進(jìn)行打印作業(yè))。
電傳打字機的研發(fā)人員為了解決此問題,決定在每行后面添加兩個表示接受的字符:CR、LF
CR(Carriage Return,回車符):告訴打字機把打印頭重定位在該行的左邊界
LF(Line Feed,換行符):告訴打字機把打印頭下移一行,即把紙向下移一行
隨著計算機的出現(xiàn),這種處理機制被移到計算機上。
但是早期計算機容量很小(存儲器很貴),有人認(rèn)為每行結(jié)尾加 2 個字符太浪費了,應(yīng)該加 1 個字符就行。
從此出現(xiàn) 行末結(jié)束符 之爭:
換行符('\n',LF,Line Feed)
回車符('\r',CR,Carriage Return)
| 系統(tǒng) | 行末結(jié)束符 | ASCII 表示 | 結(jié)束符字符數(shù) |
|---|---|---|---|
| Windows,DOS | CRLF | "\r\n" | 2 |
| Linux,UNIX | LF | "\n" | 1 |
| Mac | CR | "\r" | 1 |
這種分歧導(dǎo)致:
Windows 打開 Linux 的文件,所有的文字都會變成一行(因為 Windows 認(rèn)為 CRLF 才表示換行)
而 Linux 打開windows 文件,每一行結(jié)尾會多出一個 ^M 符號