使用C 讀取dbf行情檔案

2022-02-03 20:00:55 字數 1355 閱讀 1963

由於歷史的原因,我國的上交所和深交所使用的還是dbf檔案來進行**資料的分發,關於衛星報盤系統,可以參考: 這個部落格中關於**公司資訊化的文章寫的還是相當不錯的。上交所使用的是show2003.dbf檔案,而深交所使用的是sjshq.dbf,這種檔案可以使用visual foxpro直接開啟,檢視其內容。接下來說說怎麼使用c#讀取其中的資料。

provider=vfpoledb;data source=c:\vfp;collating sequence=machine;

這裡c:\vfp是乙個資料夾路徑,要讀取的dbf檔案就在這個資料夾下面;當然,如果dbf是在網路共享位置,那麼也可以使用網路資料夾的路徑。如果要讀取深交所**的所有資料,返回乙個dataset,那麼對應的函式為:

public

static

dataset readsjshq()  }

這個函式就可以把所有深交所的資料讀取出來,如果要讀取上交所的資料,那麼就不會這麼簡單了,雖然使用這個方法把查詢改成select * from show2003.dbf也能讀取返回乙個資料集,但是這個返回的資料集是不完整的,前面大約200多行資料沒有讀取出來。如果使用visual foxpro開啟show2003.dbf檔案可以檢視到所有的資料內容。之所以沒有返回前200多行的原因是因為dbf檔案中將這些行置為刪除狀態了,所以如果要讀取所有的資料行,那麼需要設定當前讀取的命令去掉刪除標記。比如要讀取上交所dbf檔案中的所有s1列,那麼對應的**應該是:

public

static

dataset readshow2003s1()  }

如果我們要獲取show2003裡面的所有行所有列的資料,那麼使用sql命令「select * from show2003.dbf」是會丟擲異常:

提供程式無法確定 decimal 值。例如,該行剛剛建立,未提供 decimal 列的預設值,並且使用者尚未設定新 decimal 值。

而在不讀取有刪除標記的行時是不會報錯的,這是因為前面的行中有些列值的問題,用visual foxpro開啟show2003.dbf檔案,可以看到第一行s1為000000的資料行,其s6列是當前dbf檔案資料生成的日期,比如我現在的s6值為20101209,這一列的資料定義是「數值型,寬度8,小數字數3」,據說是設計上的bug,參見:於是我們如果要正常讀取這個表的話需要對第一行做特別處理。其實本來第一行就需要特殊處理的,因為第一行並不是實際的資料,第一行主要是說明這個檔案產生的日期時間之類的,所有我使用的就是簡單粗暴的方法,使用2個dataset來返回這些資料,具體函式**為:

public

static

dataset readshow2003(dataset myset0)  }

至此,我們已經將深交所和上交所的**檔案都讀取出來了,接下來就是做其他邏輯處理~~~~~~

使用GEOTools讀取dbf檔案

前面講到使用 featurestore.addfeatures 這 個方法來把資料裝入空shp檔案內,那麼反過來,要怎麼讀取shp檔案內的屬性資料呢?這主要用到 dbasefilereader這乙個類。通過這個類可以讀取所有欄位每一行的資料,然後賦值到乙個陣列內進行輸出。具體的 如下 public ...

如何利用Pro C直接讀取dbf檔案

為了使用c語言程式設計直接讀取dbf檔案,需要了解dbf檔案的二進位制檔案格式,下面給出簡要的說明。表檔案由頭記錄及資料記錄組成。頭記錄定義該錶的結構幷包含與表相關的其他資訊。頭記錄由檔案位置 0 開始。資料記錄1緊接在頭記錄之後 連續的位元組 包含欄位中實際的文字。記錄的長度 以位元組為單位 等於...

用C 訪問DBF檔案的方法

dbf.hpp ifndef dbf h define dbf h include typedef int bool define maxfield 100 typedef struct column column int createdbf const char fname,const colum...