大型的數據庫開發中常常遇到數據源是平面文件的情況
對於這樣的數據源
無法使用數據庫對其數據進行有效的管理 本文介紹幾種常見的數據導入的方法
希望能夠給讀者以啟迪
另外
本文所涉及到的數據庫均為ORACLE數據庫
其實對於其他數據庫而言
方法類似
一 Sql*:Loader 該方法是Oracle數據庫下數據導入的最重要的方法之一
該工具由Oracle客戶端提供
其基本工作原理是
首先要針對數據源文件制作一個控制文件
控制文件是用來解釋如何對源文件進行解析
其中需要包含源文件的數據格式
目標數據庫的字段等信息
一個典型的控制文件為如下形式
LOAD DATA
INFILE
/ora
i/fengjie/agent/data/ipaagentdetail
txt
TRUNCATE
INTO TABLE fj_ipa_agentdetail
fields terminated
trailing nullcols
( AGENT_NO char
AGENT_NAME char
AGENT_ADDRESS char
AGENT_LINKNUM char
AGENT_LINKMAN char
)
其中
INFILE
/ora
i/fengjie/agent/data/ipaagentdetail
txt
指明所要導入的源文件
其實源文件也可以直接通過命令行來輸入獲得
fj_ipa_agentdetail為目標表的名字
fields terminated
是指源文件的各個字段是以逗號分隔
trailing nullcols表示遇到空字段依然寫入到數據庫表中
最後這5個字段是目標數據庫表的字段結構
通過上面這個典型的控制文件的格式分析可知
控制文件需要與源文件的格式信息一致
否則導入數據會出現異常
除了控制以外
sql*loader的還需要數據文件
即源文件
根據格式的不同
源文件可以分為固定字段長度和有分隔符這兩大類
這裡將分別說明這兩種情況
固定字段長度的文本文件
就是每個字段擁有固定的字段長度
比如
有分隔符的文本文件
就是每個字段都有相同的分隔符分隔
比如
上海長途電信綜合開發公司
南京東路
號
室
上海桦奇通訊科技有限公司
武寧路
號
室
上海邦正科技發展有限公司
南京東路
號
室
對於上述兩種文件格式sql*loader均可以做處理
下面就前面那個固定長度的文本來舉例說明
由於該文本只有兩個字段
一個為設備號
一個是區局編號
兩者的長度分別為20和5
那麼可以編制控制文件如下
LOAD DATA
INFILE
/ora
i/fengjie/agent/data/ipaagent
txt
TRUNCATE
INTO TABLE fj_ipa_agent
( DEVNO POSITION(
:
) CHAR
BRANCH_NO POSITION(
:
) CHAR
)
其中
/ora
i/fengjie/agent/data/ipaagent
txt
為該文件的完全路徑
POSITION(M:N)表示該字段是從位置M到位置N
對於有分隔符的數據文件
前面已經有一個例子
這裡就不再贅述了
總之
使用Sql*Loader能夠輕松將數據文件導入到數據庫中
這種方法也是最常用的方法
二 使用專業的數據抽取工具 目前在數據倉庫領域中
數據抽取與裝載(ETL)是一重要的技術
這一技術對於一些大的數據文件或者文件數量較多尤其適合
這裡簡單介紹目前一款主流的數據抽取工具――Informatica
該工具主要采用圖形界面進行編程
其主要工作流程是
首先將源數據文件的結構(格式)導入為Informatica裡
然後根據業務規則對該結構進行一定的轉換(transformation)
最終導入到目標表中
以上過程僅僅只是做了一個從源到目標的映射
數據的實際抽取與裝載需要在工作流(workflow)裡進行
使用專業的數據抽取工具
可以結合業務邏輯對多個源數據進行join
union
insect等操作
適合於大型數據庫和數據倉庫
三 使用Access工具導入 可以直接在Access裡選擇
打開
文本文件
這樣按照向導來導入一個文本文件到Access數據庫中
然後使用編程的方法將其導入到最終的目標數據庫中
這種方法雖然煩瑣
但是其對系統的軟件配置要求相對較低
所以也是有一定的使用范圍
四 小結
總之
平面文件轉化為數據庫格式有利於數據的處理
顯然
數據庫強大的數據處理能力比直接進行文件I/O效率高出很多
希望本文能夠對該領域做一個拋磚引玉的作用
From:http://tw.wingwit.com/Article/program/Oracle/201311/18530.html