別動我的乳酪 CSV檔案資料丟零現象及對策

2021-06-18 06:52:12 字數 3356 閱讀 6868

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...