2009-09-23 75 views
12

我需要對CSV文件(以逗號分隔的文本文件)應用SQL查詢。我的SQL是從另一個工具預定義的,並且沒有資格更改。它可能包含FROM部分中的嵌入式選擇和表別名。通過JDBC在CSV文件上執行SQL

對於我的任務,我已經發現了兩個開源(這是一個項目的要求)提供的JDBC驅動程序庫:

  1. CsvJdbc
  2. XlSQL
  3. JBoss Teiid
  4. 創建Apache Derby DB,將所有CSV作爲表格加載並執行查詢。

這是我遇到的問題:

  1. 它不接受SQL的語法(它使用內部選擇和表的別名)。此外,它自2004年以來一直未得到維護。
  2. 我無法讓它工作,因爲它具有SAX解析器,在解析其他文檔時會導致異常。同樣,自2004年以來沒有變化。
  3. 沒有檢查它是否支持語法,但看起來像一個開銷。它需要幾個實體定義(虛擬數據庫,綁定)。從郵件列表中他們告訴我最後一個版本支持運行時創建所需的對象。有沒有人使用它來完成這個簡單的任務(通常它可以連接到CSV,XML或其他DBS等數據類型並創建一個虛擬的,統一的數據)?
  4. 這甚至可以輕鬆完成嗎?

從我考慮/嘗試的4件事情來看,只有3件和4件似乎對我而言可行。有關這些的任何建議,或者我可以查詢我的CSV文件的任何其他方式?

乾杯

回答

3

如果你的SQL是預定義的,不能改變你的最佳選擇是將您的CSV加載到數據庫中,並對其運行查詢。

Apache Derby是一個可行的選擇,MySQL也是一個可行的選擇,它甚至有一個CSV storage enginePostgreSQL

您的SQL是否使用任何專有功能/擴展?如果是這樣,那可能會限制你的選擇。

+0

是的,它使用子串和連接。 – 2009-09-24 13:22:57

3

我會說嵌入式數據庫。我建議Javadb(內置於Java API中的Derby)或者H2,如果你不在意拉動額外的依賴。

9

我會加載數據到HSQL(HypersonicSQL)。純Java,正確的SQL,久經考驗。其他任何東西都有更大的佔地面積。

+1

實際上,HSQLDB是唯一可以將現有CSV文件作爲SQL表打開的建議解決方案。它允許直接在CSV文件上執行SQL查詢並更新記錄。 – fredt 2010-11-21 13:43:21

+1

http://hsqldb.org/doc/guide/ch06.html包含更多詳細信息 – 2012-01-23 11:37:19

+0

Hi @Vladimir如果我想處理的csv文件在5到10 GB的範圍內非常大? – u449355 2014-05-31 17:43:56

0

有一個Groovy腳本,gcsvsql可以讓你將csv文件視爲數據庫表,包括連接。隨着gcsvsql你可以做這樣的事情:

gcsvsql 「選擇people.csv *,其中年齡> 40」

gcsvsql「選擇 people.name,孩子。從 people.csv,children.csv其中 people.name = children.name」

gcsvsql 「選擇AVG(分數)從 people.csv其中年齡< 40」

你可以找到孩子這個腳本,是基於H2數據庫引擎,在谷歌代碼在這裏:

http://code.google.com/p/gcsvsql/

1

如果你想從一個Java程序中處理的CSV文件的數據庫,你應該看看h2 database engine.它對讀取/寫入CSV文件和使用內存數據庫有非常好的支持。它是hsql的繼任者,速度更快,並具有增加的功能。你可以在h2教程中閱讀關於csv的支持。

+0

您可以閱讀這篇博客文章中使用h2在Groovy腳本中使用h2的方式: http://bayesianconspiracy.blogspot.com/2010 /02/executing-arbitrary-sql-on-csv-files.html – Kolmogorov 2010-04-01 00:10:50

1

可能有點晚,對不起。

我一直在開發csvjdbc一年多了,自從幾個星期以來,我對該項目擁有「管理員」權利,因此我能夠發佈我製作的最新版本。它確實需要我們需要的所有「我們」(我們:我和我現在的我的同事們),並且在錯誤歸檔時添加內容。

現在看看它,然後再決定。 (網絡文檔仍然需要審查,以獲得更好的洞察力,檢查非常廣泛的測試用例)。

+0

嵌入式選擇?表別名?不,在那裏還沒有。但後來,隨時提交一個非工作查詢錯誤報告,誰知道... – mariotomo 2010-05-29 07:28:13

0

我知道,這是一個非常古老的情況下,但是......

CsvJdbc是一個很酷的庫,但也有使用DbUtils而映射到ResultsSets POJO的一些問題。 第二件壞事是,對不同數據類型的dos沒有很好的支持。

CSVJdbc後,我會用一個愚蠢的CsvParser來讀取文件,將它們泵入一個HsqlDB或類似的東西。

+0

你有報告與csvjdbc的問題?當前的維護者(不再是我)很快就會提出嚴重問題。 – mariotomo 2015-07-03 12:12:33

+0

不,我沒有。我無法在那裏創建票。 – Mirko 2015-07-06 08:10:23

+0

您應該可以在登錄/註冊後在那裏創建票證。匿名用戶不允許創建或更新票據。我想爲了避免垃圾郵件發送者......但更具體地說,你遇到了什麼「一些問題」,以及你期望什麼「良好支持」? – mariotomo 2015-07-11 16:32:39