csv檔案在讀入excel時,對於前面有零的資料項,比如**號碼,會自作聰明地丟掉那個零。
比如,我有乙個北京客戶,其號碼為01059178888,如果這是通過csv檔案來的資料,在excel中開啟時,就成了1059178888,甚至會成為1e+9。
當然,微軟官方幫助檔案說,你在開啟此類檔案時,手動指定列的型別就可以避免丟零。如果我有幾個這樣的列,倒還可以,如果有幾十個這樣的列呢?累死人啊。還有,有些使用者就希望徹底自動化,對此,微軟還真沒有給出什麼解決方案。全世界成千上萬的使用者在解決丟零問題上不知浪費了多少時間。
對微軟來說,解決這個問題可以說是徒手之勞,比如,允許使用者設定成,在讀入csv檔案時,所有列都預設為字串,而不是讓excel自作聰明去解釋資料。
請問,誰給了excel改變我資料的權利?
當然,這種現象除了微軟的傲慢外,csv格式的先天不足是另外乙個原因。csv只包含資料,而對資料並無任何描述。這就使得微軟對使用者資料動手動腳提供了藉口。
近年來,隨著xml的進化與普及,隨著微軟軟體的進一步公開化,這個問題的解決已顯露端倪。
這裡假設我要從資料庫中讀出一批資料,將其儲存為文字檔案,讓使用者在excel上進一步處理。
我不希望丟零,又希望使用者不費太多手腳。
(本文使用的驗證環境為 excel 2010)
資料樣品如下:
idname
phone
address
0001
李開復01059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
0002
張復開01059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
1. 輸出csv格式,資料如下:
0001,李開復,01059178888,北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
0002,張復開,01059179999,北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
如果在excel中開啟以上csv格式的檔案,將會出現:
idname
phone
address
1李開復
1e+9
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
2張復開
1e+9
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
id前的0丟掉了不說,**號碼變成了科學計數法的數字。
2. 輸出簡單xml格式
因為是簡單的xml格式,並不牽扯定義dad等檔案,在程式上容易實現。
例如:<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="******.xsl" ?>
0001
李開復01059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
0002
張復開01059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
在excel開啟時,出現幾個對話方塊,但只要按ok鍵,還是可以開啟。但是,id/phone還是丟零。
idname
phone
address
李開復1059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
2張復開
1059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
別急,我們可以告訴excel,這個id列是文字。
下例中,通過給第一行資料置入文字串的做法,讓excel把所有的列都認作文本,而不是數字,從而避免丟零。
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="******.xsl" ?>
idname
phone
address
0001
李開復
01059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
0002
張復開
01059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
在excle開啟時: (第一行的abcd是新加的專案名稱,紅色部分才是原來的名稱。)ab
cdidname
phone
address
李開復01059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
0002
張復開01059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
這樣的資料開啟後,使用者只要刪除第一行也就可以了。
3. 輸出xml spreadsheet 2003(xmlss)格式
xmlss的格式就要複雜一些。但仍然是程式設計可以接受的範圍。
但是,我們可以省略一些不必要的東西。下例就是乙個不能再簡化的xmlss資料。
idname
phone
address
created_date
0001
李開復01059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
2013-02-23t00:00:00.000
0002
張復開01059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
2013-02-23t00:00:00.000
因為可以具體指定每個cell的資料型別(number/string/datetime),可以更精確地顯示各個資料的格式。
上例中故意把這個資料指定為number,在讀入excel之後,這項資料前面的零將被丟掉。
idname
phone
address
created_date
李開復1059178888
北京市朝陽區望京街8號利星行廣場微軟大廈 12 層
2013/2/23
2張復開
1059179999
北京市朝陽區望京街9號利星行廣場巨硬大廈 21 層
2013/2/23
如何生成上述xmlss格式的資料,這個太簡單了,就不用我再說了吧。
4. 直接生成xlsx檔案
從office2007之後,excel檔案字尾變成4位,xlsx。xslx檔案實際上是乙個zip檔案。如果你改變xlsx字尾為zip,你就可以開啟它。
你會發現,這是一大堆xml檔案和其他資料檔案的組合。如果你下點功夫,你會弄懂它的結構。
最近發現一位大牛為apex寫的乙個外掛程式,從oracle中能直接輸出xlsx檔案。
有興趣的話可以看看。我試著用過,修改了對列數目的限制,還是不錯的。當然,還有一些其他問題,以後做別論。
matlab讀取csv檔案資料
注意 csvread函式只試用與用逗號分隔的純數字檔案 第一種 m csvread filename 直接讀取csv檔案的資料,並返回給m 第二種 m csvread filename r,c 讀取csv檔案中從第r 1行,第c 1列的資料開始的資料,這對帶有標頭檔案說明的csv檔案 如示波器等採集...
讀取CSV檔案資料練習
import csvfrom matplotlib import pyplot as plt from datetime import datetime 讀取csv檔案資料 filename sitka weather 2014.csv with open filename as f 開啟這個檔案,...
關於CSV檔案資料集的處理
在處理大型csv資料集時,如果目標只是擷取其中一部分資料,則需要對資料進行處理,處理的思想如下 開啟需要讀取和寫入的csv檔案,按行讀取檔案中的資料,在這裡讀取出來的一行資料被放在了乙個列表中,列表中儲存的都是字串型別 with open fileread,r as file to read for...