是否有针对CSV文件的基于开源文件(非基于内存的)JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户将拥有不同的CSV文件。我这样做是为了减少数据库命中,因为信息包含在CSV文件中。我只需要执行SELECT
次操作。
如果我们指定索引,HSQLDB允许索引搜索,但是我将无法提供可用作索引的唯一列,因此它在内存中执行SQL操作。
修改
我尝试过CSVJDBC但不支持order by
和group by
这样的简单操作。目前还不清楚它是从文件读取还是加载到内存中。
我尝试过xlSQL,但它再次依赖于HSQLDB,只适用于Excel,而不适用于CSV。此外,它还没有开发或支持。
H2,但只能读取CSV。不支持SQL。
答案 0 :(得分:3)
您可以使用H2 database解决此问题。
以下groovy脚本演示:
注意: H2支持内存数据库,因此您可以选择是否保留数据。
// Create the database
def sql = Sql.newInstance("jdbc:h2:db/csv", "user", "pass", "org.h2.Driver")
// Load CSV file
sql.execute("CREATE TABLE data (id INT PRIMARY KEY, message VARCHAR(255), score INT) AS SELECT * FROM CSVREAD('data.csv')")
// Print results
def result = sql.firstRow("SELECT message, score, count(*) FROM data GROUP BY message, score ORDER BY score")
assert result[0] == "hello world"
assert result[1] == 0
assert result[2] == 5
// Cleanup
sql.close()
示例CSV数据:
0,hello world,0
1,hello world,1
2,hello world,0
3,hello world,1
4,hello world,0
5,hello world,1
6,hello world,0
7,hello world,1
8,hello world,0
9,hello world,1
10,hello world,0
答案 1 :(得分:1)
如果您查看sourceforge项目csvjdbc,请报告您的expierences。文档说它对导入CSV文件很有用。
答案 2 :(得分:1)
超级用户https://superuser.com/questions/7169/querying-a-csv-file对此进行了讨论。
您可以使用hsqldb的文本表功能:http://hsqldb.org/doc/2.0/guide/texttables-chapt.html
csvsql / gcsvsql也是可能的解决方案(但是没有JDBC驱动程序,您必须为查询运行命令行程序)。
sqlite是另一种解决方案,但您必须先将CSV文件导入数据库,然后才能进行查询。
或者,有一些商业软件,例如http://www.csv-jdbc.com/,它可以做你想要的。
答案 3 :(得分:0)
要对文件执行任何操作,您必须在某些时候将其加载到内存中。您可以做的只是打开文件并逐行阅读,在您阅读新文件时丢弃上一行。这种方法的唯一缺点是其线性。您是否考虑在服务器上使用memcache之类的内容,在内存中使用键值存储,您可以查询而不是转储到CSV文件?
答案 4 :(得分:0)
您可以使用专用JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net),也可以选择配置数据库引擎(如mySQL)将CSV作为表格处理,然后通过标准操作CSV JDBC驱动程序。
此处的权衡 - 可用的SQL功能与性能。
因此,如果表的大小相对较小 - 请使用mySQL。但是,如果您需要处理大文件(> 100Mb)而无需分组或排序 - 请使用CsvJdbc。 如果你需要两者 - 处理非常bif文件并能够使用SQL操作它们,那么最佳的操作方法 - 首先将CSV加载到普通数据库表(例如mySQL),然后像往常一样处理数据表。