2016-01-22 120 views
0

FILE.TXT:數據加載到Oracle數據庫

Itemnumber 20 
Quantity 2 
Itemname Rubber 

需要幫助這個數據裝載到表?

我覺得一個ctl文件可以將數據加載到表中。我遇到了加載CSV,基於位置的負載(位置1:10)。你能幫我加載上面的文件嗎?

Select * from stationary 
Item_number,quantity,item_name 

是列。

+0

請顯示您嘗試過的結果。結果將轉到.log文件。這組3行是否真的包含記錄重複?您是否可以對記錄進行預處理,以便在一行上自行獲取數據元素? –

+0

可以有NULL值嗎? –

回答

1

雖然我強烈建議您讓數據提供者爲您提供加載正確格式的數據,或者做一些預處理以便自己首先構建適當的格式,我認爲這是最後的手段,因爲REGEXP功能很昂貴,如果這個文件很大,它很可能需要很長時間來處理。無論如何,我們都必須處理來自供應商的廢話數據,並且必須做我們必須做的事情,無論如何:-)

CONCATENATE 3子句告訴sqlldr在處理前將每3行組合成1行。然後,任務是從該行中獲取數據元素。

sqlldr讀取該行並且由於沒有定義分隔符,整個行實際上是一個字段並與控制文件TEMP中的第一個字段匹配。 TEMP與表stationary中的列不匹配,因此不會嘗試插入它,但在右側,您會看到它被定義爲BOUNDFILLER,它告訴sqlldr要記住它,但不要做任何其他操作。 sqlldr然後看到控制文件中定義的其他字段與表中的列匹配,因此它應用表達式並將結果插入到相應的列中。

表達式對已保存的行進行操作並挑出該行的數據部分。

load data 
infile 'file.txt' 
CONCATENATE 3 
into table stationary 
append 
TRAILING NULLCOLS 
(
    TEMP   BOUNDFILLER CHAR(1000), 
    Item_number EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Itemnumber +([0-9]+)', 1, 1, NULL, 1)", 
    quantity  EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Quantity +([0-9]+)', 1, 1, NULL, 1)", 
    item_name  EXPRESSION "REGEXP_SUBSTR(:TEMP, 'Itemname +(.*)', 1, 1, NULL, 1)" 
) 

由於數據元素名稱在數據文件中被硬編碼,因此請查找並獲取後面的數據部分。即對於Itemnumber,請查找文本'Itemnumber',然後查找一個或多個空格,後跟一個或多個數字(這些數字會被記住,因此會在REGEXP_SUBSTR的組中返回)。重複其他元素。

編輯:有關此一點點的思考,第一2個元件可縮短這樣抓住一個數的第一和第二齣現(假定零將在那裏,而不是對於零量的NULL):

Item_number EXPRESSION "REGEXP_SUBSTR(:TEMP, '[0-9]+', 1, 1)", 
    quantity  EXPRESSION "REGEXP_SUBSTR(:TEMP, '[0-9]+', 1, 2)", 

試試看,並嘗試一下。

Assumptions: 
- Hardcoded element names won't change 
- There will always be at least one space between element names and their value 
- There will be no NULL item numbers or quantities (a 0 will be there) 
- item_name data can't contain one of the hardcoded element names 

Caveats 
- The common regex shortcut of \d for a digit does not work. 
+0

好的...... –