2012-05-16 33 views
0

我有30k +文本文件,列數不同,空格分隔,任務是將數據逐列加載到1個大oracle表中。細節&可能的方法是如下:從多個文本文件中加載數據,列數不同1個大表

文本文件1-

Date Time SiteName CompName ipAdd 
jkl mno pqr stu vwx 

文本文件2-

Date CompName ipAdd 
abc def ghi 

文本文件3-

Date SiteName 
mno pqr 

預期的Oracle表-1

Date Time SiteName CompName ipAdd 
jkl mno pqr stu vwx 
abc   def ghi 
mno  pqr 

現在,正如您所看到的,在多個文本文件中存在不同數量的「相同」列。我必須將數據加載到1個大的Oracle表中。

請注意:

中的所有文本文件,第一列始終是「日期」,併發生在列的順序,即從日期到Time..or日期COMPNAME ...(一從日期開始增加訂單)

問題是我無法找到一種方法來使用SQL Loader,它可以區分2個不同文本文件中的2列和15列,即使我有他們的名字在第一行文本文件中,然後將它們加載到一個大表中。

途徑:

  • 將所有文本文件中,以1個大的文本文件,並做一些事情 - 失敗
  • 試圖把一個分隔符,用於列的最大數量,可以是出所有的文本文件(25列),並做一些事情 - 不能
  • 在35k + oracle表中加載35k +文本文件,然後坐下並將這些35k + oracle表合併到一個大表中 - 由PPL在我身邊推薦,但它太長了,可能會空間&時間/努力不足,因此我尋找一個真正的替代品

請給你最好的辦法。 :-(

+0

請不要在title(http://meta.stackexchange.com/a/130208/167443) – yoozer8

+0

@APC中重複問題標籤,感謝格式化..我盡我所能。 :) – Chirayu

+0

@Jim,這不是一個非常有建設性的評論..我看到了SQL Loader問題是如何被問到的,通過標籤搜索之後,所以有標題。但是好的..下次我會記住..謝謝。 – Chirayu

回答

0

負載每一個成相匹配的文件的結構,然後利用SQL代碼來清理德數據,並將其移動到最終生產的表。

替代,這些文件歸還給人民一個臨時表誰是送他們到yhou並拒絕接受他們inutl它們符合標準的文件規範。

+0

感謝您回覆..很快..所以你的意思是從上面的第三appraoch ..是嗎? 此外,通過匹配您指的文件結構,3列文本文件到3列登臺表..正確?! – Chirayu

+0

對所有問題都回答是 – HLGEM

+0

那麼數據是在..所以不能發回它..大聲笑! (希望我可以爲一個標準)。我會等待幾個更多的答案。謝謝! – Chirayu

1

假設你張貼的例子是準確和每個文件的第一行是列標題這裏是一般的方法我會(如果每個文件的第一行不是列標題,我認爲你幾乎塞滿了)

這將在* nix上比在Windows上容易得多,儘管我希望Powershell能夠處理這些任務(我不是Powershell的人)。

  1. 編寫一個shell腳本來讀取每個文件的第一行,並將其寫入列表文件以及文件名。
  2. 按所有列對該列表文件的內容進行排序。這將按列分組所有文件名。你需要這樣做,因爲知道列數是不夠的:我認爲一些文件有三列將有Date Time SiteName和其他將有Date Time ipAdd
  3. 我建議你在列表文件中標記每個組。這將是充足的乏味,它將是值得與文本處理器自動化,但現在我不知道我會怎麼做。
  4. 您將需要爲前面階段中確定的列的每個排列編寫一個加載程序文件。
  5. 然後,您需要使用適當的控制文件將每個文本文件提交給加載程序。這就是爲什麼使用它的組標記每個文件名是一個好主意:它會讓這個階段自動化更容易。

另外,使用external tables而不是SQL Loader會更簡單。外部表的DDL比Loader控制文件更容易編寫,您可以使用SQL來查詢它們。基本上,外部表是暫存表,但數據在OS文件中而不在數據庫中。

請注意,您不需要35,000個臨時表。你只需要爲每個不同的列組合使用acosss所有文本文件。當然,考慮到你在目標表中有25列,排列的可能數量是huuuuuge,但我們假設它實際上是一個可管理的數字。

+0

對不起,在上面的評論中沒有提到,所以是的,每個tex文件的第一行是列名。你所建議的方式似乎也很漫長,也很艱難和乏味。感謝您回覆APC ..仍然在尋找答案。 :( – Chirayu

相關問題