2011-10-11 73 views
1

我正在使用Java作爲前端和Oracle將需要上傳大型CSV文件(大約6 GB)的桌面應用程序(Extract Transform Load類型的應用程序)後端,但我也開放給其他數據庫和工具(即SQLite,H2,HSQLDB,MySQL)。將CSV文件上傳到數據庫的Java桌面應用程序

我嘗試使用開放源代碼Java庫,用於分析和上傳CSV文件,如:

  1. OpenCSV
  2. Super CSV

的問題,這些庫是效率。他們需要太多時間上傳。例如,上傳4 Gb的CSV文件需要6小時。

有了這個經驗,我決定嘗試數據庫實用程序來上傳CSV文件。其中之一是Oracle SQL * Loader。它更快,並提供理想的結果。它可以消除空格,CSV文件加載到各種表格,使用Oracle函數suchs作爲解碼等

不過,我有以下問題:

  1. 我無法找到一個辦法讓SQL *加載程序的錯誤/ Java日誌並顯示給用戶。

  2. 因爲SQL * Loader是專有的,所以沒有辦法將它嵌入到我的應用程序安裝中。例如,用戶需要在安裝我的應用程序之前單獨下載並安裝Oracle Client。另一件事是我需要檢查在安裝過程開始之前是否安裝了Oracle Client。

我尋找其他可能的解決方案,並找到像SQLite和H2這樣的無頭數據庫。

在SQLite上,我使用.import命令上傳CSV文件。但是我無法用Java來稱呼它。

我轉向H2數據庫,但由於不支持轉義標題行,所以我很難上傳。

請讓我知道您的建議。

謝謝你。

+0

你必須使用SQLite嗎?你不能使用外部表來加載數據嗎?使用外部表格很容易排除頁眉和頁腳。 – Ollie

+0

沒有。我正在創建一個* java *桌面應用程序,它可以儘可能快地將大型.csv *文件加載到本地數據庫,而不管數據庫如何。 – epsac

回答

0

這聽起來像你可以使用CloverETL這一點。它是基於Java的數據集成和ETL工具。隨着其商業版本,它有一個免費的,opensource ETL engine。將它作爲Java庫嵌入到應用程序中應該很容易。除了瓶頸在數據庫方面,您也不應該有任何上面提到的性能問題。據說CloverETL速度很快。

如果您需要了解其他技術細節,您可以問我或使用CloverETL forum

+0

非常感謝!這將對我的項目有很大的幫助。 :-) – epsac

1

如果你有一個bash shell中,你可以這樣做:

sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name 
+0

謝謝,但我沒有bash。我正在開發一個Windows平臺。順便說一句,它不一定是SQLite。它可能是嵌入到我的Java桌面應用程序中的其他數據庫,並且可以以閃電般的速度加載大型CSV文件。 – epsac

+0

@ user692533如果你安裝Cygwin,你會怎麼做(不知道這是否是最好的解決方案;只是說)。 –

0

我假設你正在使用SQLite的命令行管理工具。

最簡單的方法是將導入文件的頁眉和頁腳行導入到sqlite之前,使用您最喜歡的系統編輯功能。

如果您發佈的示例文件是準確的,那麼您將不得不這樣做,因爲最後一行(僅包含一列)將被SQLITE .import命令拒絕,從而導致整個輸入中止。

如果解決頁腳問題,並堅持使用SQLite的命令,這裏是一個建議的技術:

修復頁腳

HEADER1, HEADER2, HEADER3 
row1,row2,row3 
row11,row22,row33 
row111,row222,row33 
FOOTER, FOOT1, FOOT2 

執行進口

sqlite> select * from test; 
HEADER1, HEADER2, HEADER3 
row1,row2,row3 
row11,row22,row33 
row111,row222,row33 
FOOTER, FOOT1, FOOT2 

刪除頁腳

sqlite> select count() from test; 
5 
sqlite> delete from test where rowid=5; 

刪除頁眉

sqlite> delete from test where rowid=1; 
sqlite> select * from test; 
row1,row2,row3 
row11,row22,row33 
row111,row222,row33 
+0

謝謝你的幫助。糾正我,如果我錯了,但我知道我不能使用SQLite,因爲它缺乏在java中導入大型csv文件的功能。 – epsac

+0

你應該在你的問題中提到你正在使用java。如果你添加java標籤,你會引起java專家的注意。簡而言之,您應該編寫java代碼來讀取您的csv文件,解析它並生成所需的SQL INSERT語句。不管你使用什麼數據庫引擎,這個過程都是一樣的。 – ravenspoint

+0

謝謝你的建議。我已經在我的標籤中添加了「java」並重新修改了我的問題。 – epsac

相關問題