2016-04-11 22 views
-1

我需要定期轉儲到表中的csv文件中有非常髒的數據。這個csv文件包含了前幾天的所有記錄(感謝第三方供應商!),但我滿足於讓唯一約束保持這些記錄不會重複。SQL Loader字段可以通過它相對於最後一個字段的位置來指定嗎?

但是,這些髒數據的性質使得nincompoops在數據本身中添加了額外的逗號,並且雙引號字段太難了(不要讓自己的第三方供應商疲於奔命)。所以,雖然理想記錄有7個字段,但其中一些字段最多可以記錄12個字段。

而外地我真的需要的是附加日期。它始終是第7場(除非是第8,9,10,11或12號)。

有沒有辦法指定這個列是最後一個字段?

該控制文件似乎允許字段逐個位置,但只適用於固定長度的記錄(字符45-68等)。有什麼方法可以直接告訴它「最後一個」並從中獲益?

注意:通過文檔挖掘並瞭解到我需要做的每件有趣/有用的事情都是不可能的,我已經知道了答案,但無論如何我必須問。

+0

您是否可以選擇預處理文件,也許使用腳本將最後一個字段移動到行首? –

+0

@AlexPoole我有這個選擇,我想。還嘮叨我的老闆,看看供應商是否可以解決這個問題。老實說,我不想通過這一系列不同的步驟,開始感覺自己已經更好了(即使我知道這是一個錯誤)。主要需要證實我所問的是不可能的。 –

+0

假設最大效率不是一個主要問題,我會試圖將數據加載到一個'varchar2(4000)'(或32000,如果你使用超長字符串的話是12.1)然後編寫你自己的解析邏輯(即第6個逗號右側的所有內容都是您要查找的字段)。 –

回答

0

帶有.csv看起來像這樣(每您的問題最後一個日期可變長度記錄):

Lance,Link,07/28/1968 
Mata,M,Hairi,11/22/1969 
Ba,ron,von But,cher,,,02/28/1966 

構造控制文件是這樣的:

load data 
infile 'x_test.csv' 
into table x_test 
truncate 
FIELDS TERMINATED BY x'0D0A' TRAILING NULLCOLS 
(
    x  BOUNDFILLER, 
    col1 EXPRESSION "TO_DATE(REGEXP_SUBSTR(:x, '.*,(.*)$', 1, 1, NULL, 1), 'MM/DD/YYYY')" 
) 

SQLLDR將讀取每一行並且由於它被定義爲BOUNDFILLER將不會嘗試加載它,而是「記住」它以後用作'x'。接下來,它會看到與表中列匹配的'col1',以便它運行表達式,該表達式從記憶緩衝區'x'中提取最後一個逗號後面的內容,直到行末,將其轉換爲日期並加載日期進入col1。

SQL> select col1 
    from x_test; 

COL1 
--------- 
28-JUL-68 
22-NOV-69 
28-FEB-66 

SQL> 

我相信照顧這個問題。您很可能需要調整日期格式,真正的正則表達式對於您實際處理的日期格式應該更嚴格,而不僅僅是接受行結束處的內容。

相關問題