Link Search Menu Expand Document

龐大.dbf檔案之讀取

Table of contents

背景

.dbf檔案格式之歷史與必須性

  • pythonruby等高階資料庫程式語言流行之前,DBASE是早期常用的資料庫軟體之一,雖然目前仍然持續發展應用,然其活力已大不如前。dbf檔案即為DBASE軟體指定使用的資料庫檔案格式,目前仍為環保署TEDS資料庫之公告檔案格式,其強項包括:
    • 具有清楚規範的表頭
    • 資料表之長度可以跨越一般軟體的限制,然而仍有上限
    • 為多數軟體、程式語言間互通之格式

方案及策略

  • 如前所述,使用資料庫軟體查詢、修改,會因應資料筆數太長而失敗
  • fortran無法直接讀取dbf檔案,只能讀取sdf檔案,須先將dbf轉成sdf
  • python提供了許多dbf檔案格式的reader
    • 包括pandas即可直接讀取,網友也曾充分討論並速度評比,
    • 經測試,simpledbf可以正確解讀TEDS.dbf檔,具有簡捷之特性

執行

  • 用法:dbf2csv.py TEDS11_AREA_WGS84.dbf

程式說明

  • 使用simpledbfDbf5模組
  • 有中文狀況會因py27/py37版本而有差異,須以嘗試錯誤法寫出
    • py27對寫出中文較寬鬆
    • py37須註明coding
  • 寫出檔案(TEDS11_AREA_WGS84.csv共367萬筆)格式為csv,方便後續處理
kuang@master /nas1/TEDS/teds11
$ cat dbf2csv.py
from simpledbf import Dbf5
from pandas import *
import sys
fname=sys.argv[1]
if 'dbf' in fname:
  fnameO=fname.replace('dbf','csv')
elif 'DBF' in fname:
  fnameO=fname.replace('DBF','csv')
else:
  sys.exit('name must contain dbf or DBF')
dbf = Dbf5(fname, codec='utf-8')
df = dbf.to_dataframe()
try:
  df.set_index(df.columns[1]).to_csv(fnameO,coding='utf8')
except:
  df.set_index(df.columns[1]).to_csv(fnameO)

Reference

  • Discussion on pandas transform a dbf table into a dataframe, stackoverflow, 2018/8/3
  • Ryan Nelson, simpledbf 0.2.6, pypi, Released: May 14, 2015