Java 用于CSV文件的基于文件(不在内存中)的JDBC驱动程序
是否有用于CSV文件的基于开源文件(而不是基于内存)的JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户都有一个不同的CSV文件。我这样做是为了减少数据库点击,因为信息包含在CSV文件中。我只需要执行Java 用于CSV文件的基于文件(不在内存中)的JDBC驱动程序,java,jdbc,csv,Java,Jdbc,Csv,是否有用于CSV文件的基于开源文件(而不是基于内存)的JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户都有一个不同的CSV文件。我这样做是为了减少数据库点击,因为信息包含在CSV文件中。我只需要执行SELECT操作 如果我们指定索引,HSQLDB允许索引搜索,但我无法提供唯一的列作为索引,因此它在内存中执行SQL操作 编辑: 我尝试过CSVJDBC,但它不支持简单的操作,如orderby和groupby。目前还不清楚它是从文件中读取还是加载到内存中 我尝试过xlSQL,但它
SELECT
操作
如果我们指定索引,HSQLDB允许索引搜索,但我无法提供唯一的列作为索引,因此它在内存中执行SQL操作
编辑: 我尝试过CSVJDBC,但它不支持简单的操作,如
orderby
和groupby
。目前还不清楚它是从文件中读取还是加载到内存中
我尝试过xlSQL,但它同样依赖于HSQLDB,只适用于Excel,而不适用于CSV。加上它不再处于开发或支持阶段
H2,但它只读取CSV。不支持SQL。如果您检查sourceforge项目,请报告您的经验。文档中说它对于导入CSV文件很有用
如果您检查sourceforge项目,请报告您的经验。文档中说它对于导入CSV文件很有用
这是在超级用户上讨论的 您可以使用hsqldb的文本表功能: csvsql/gcsvsql也是可能的解决方案(但是没有JDBC驱动程序,您必须为查询运行命令行程序) sqlite是另一种解决方案,但您必须先将CSV文件导入数据库,然后才能查询它
或者,还有一些商业软件,例如,它可以做你想做的事情。这是在Superuser上讨论过的 您可以使用hsqldb的文本表功能: csvsql/gcsvsql也是可能的解决方案(但是没有JDBC驱动程序,您必须为查询运行命令行程序) sqlite是另一种解决方案,但您必须先将CSV文件导入数据库,然后才能查询它
或者,还有一些商业软件,比如它可以做你想做的事情。要对文件做任何事情,你必须在某个时候将其加载到内存中。你可以做的就是打开文件,逐行读取,在读取新文件时丢弃上一行。这种方法唯一的缺点是它的线性。您是否考虑过在服务器上使用类似的方法,在服务器上使用存储在内存中的键值来查询,而不是转储到CSV文件?要处理文件,您必须在某个时候将其加载到内存中。你可以做的就是打开文件,逐行读取,在读取新文件时丢弃上一行。这种方法唯一的缺点是它的线性。您是否考虑过在服务器上使用类似的方法,在服务器上使用内存中的键值存储,您可以查询而不是转储到CSV文件?您可以使用解决此问题 以下groovy脚本演示了:
// 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
您可以使用解决此问题 以下groovy脚本演示了:
// 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
您可以使用任何一种专用的JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net)或者,您可以选择配置数据库引擎(如mySQL),将CSV视为一个表,然后通过标准JDBC驱动程序操作CSV 这里要权衡的是可用的SQL功能与性能
- 通过CsvJdbc(或类似)直接访问CSV将允许您对大数据量进行非常快速的操作,但不具备使用SQL命令对记录进行排序或分组的功能李>
- mySQL CSV引擎可以提供丰富的SQL功能集,但要付出性能代价李>
如果您需要两者—处理非常bif的文件,并能够使用SQL操作它们,那么最佳的做法是—首先将CSV加载到普通的数据库表(例如mySQL),然后像平常的SQL表一样处理数据 您可以使用任何一种专用的JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net)或者,您可以选择配置数据库引擎(如mySQL),将CSV视为一个表,然后通过标准JDBC驱动程序操作CSV 这里要权衡的是可用的SQL功能与性能
- 通过CsvJdbc(或类似)直接访问CSV将允许您对大数据量进行非常快速的操作,但不具备使用SQL命令对记录进行排序或分组的功能李>
- mySQL CSV引擎可以提供丰富的SQL功能集,但要付出性能代价李>
如果您需要两者—处理非常bif的文件,并能够使用SQL操作它们,那么最佳的做法是—首先将CSV加载到普通的数据库表(例如mySQL),然后像平常的SQL表一样处理数据 我已签出csvjdbc。csvjdbc上允许的操作非常有限。我无法执行简单的操作,如按排序和按分组。我已签出csvjdbc。csvjdbc上允许的操作非常有限。我无法执行简单的操作,如按排序和按gro排序