FILE.TXT:數據加載到Oracle數據庫
Itemnumber 20
Quantity 2
Itemname Rubber
需要幫助這個數據裝載到表?
我覺得一個ctl文件可以將數據加載到表中。我遇到了加載CSV,基於位置的負載(位置1:10)。你能幫我加載上面的文件嗎?
Select * from stationary
Item_number,quantity,item_name
是列。
FILE.TXT:數據加載到Oracle數據庫
Itemnumber 20
Quantity 2
Itemname Rubber
需要幫助這個數據裝載到表?
我覺得一個ctl文件可以將數據加載到表中。我遇到了加載CSV,基於位置的負載(位置1:10)。你能幫我加載上面的文件嗎?
Select * from stationary
Item_number,quantity,item_name
是列。
雖然我強烈建議您讓數據提供者爲您提供加載正確格式的數據,或者做一些預處理以便自己首先構建適當的格式,我認爲這是最後的手段,因爲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.
好的...... –
請顯示您嘗試過的結果。結果將轉到.log文件。這組3行是否真的包含記錄重複?您是否可以對記錄進行預處理,以便在一行上自行獲取數據元素? –
可以有NULL值嗎? –