Java 用于CSV文件的基于文件(不在内存中)的JDBC驱动程序

Java 用于CSV文件的基于文件(不在内存中)的JDBC驱动程序,java,jdbc,csv,Java,Jdbc,Csv,是否有用于CSV文件的基于开源文件(而不是基于内存)的JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户都有一个不同的CSV文件。我这样做是为了减少数据库点击,因为信息包含在CSV文件中。我只需要执行SELECT操作 如果我们指定索引,HSQLDB允许索引搜索,但我无法提供唯一的列作为索引,因此它在内存中执行SQL操作 编辑: 我尝试过CSVJDBC,但它不支持简单的操作,如orderby和groupby。目前还不清楚它是从文件中读取还是加载到内存中 我尝试过xlSQL,但它

是否有用于CSV文件的基于开源文件(而不是基于内存)的JDBC驱动程序?我的CSV是根据用户选择从UI动态生成的,每个用户都有一个不同的CSV文件。我这样做是为了减少数据库点击,因为信息包含在CSV文件中。我只需要执行
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脚本演示了:

  • 将数据加载到数据库中
  • 运行“分组依据”和“订单依据”sql查询
  • 注意: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
    

    您可以使用解决此问题

    以下groovy脚本演示了:

  • 将数据加载到数据库中
  • 运行“分组依据”和“订单依据”sql查询
  • 注意: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
    

    您可以使用任何一种专用的JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net)或者,您可以选择配置数据库引擎(如mySQL),将CSV视为一个表,然后通过标准JDBC驱动程序操作CSV

    这里要权衡的是可用的SQL功能与性能

    • 通过CsvJdbc(或类似)直接访问CSV将允许您对大数据量进行非常快速的操作,但不具备使用SQL命令对记录进行排序或分组的功能
    • mySQL CSV引擎可以提供丰富的SQL功能集,但要付出性能代价
    因此,如果表的大小相对较小,请使用mySQL。但是,如果您需要处理大文件(>100Mb),而不需要分组或排序,请使用CsvJdbc。
    如果您需要两者—处理非常bif的文件,并能够使用SQL操作它们,那么最佳的做法是—首先将CSV加载到普通的数据库表(例如mySQL),然后像平常的SQL表一样处理数据

    您可以使用任何一种专用的JDBC驱动程序,如CsvJdbc(http://csvjdbc.sourceforge.net)或者,您可以选择配置数据库引擎(如mySQL),将CSV视为一个表,然后通过标准JDBC驱动程序操作CSV

    这里要权衡的是可用的SQL功能与性能

    • 通过CsvJdbc(或类似)直接访问CSV将允许您对大数据量进行非常快速的操作,但不具备使用SQL命令对记录进行排序或分组的功能
    • mySQL CSV引擎可以提供丰富的SQL功能集,但要付出性能代价
    因此,如果表的大小相对较小,请使用mySQL。但是,如果您需要处理大文件(>100Mb),而不需要分组或排序,请使用CsvJdbc。
    如果您需要两者—处理非常bif的文件,并能够使用SQL操作它们,那么最佳的做法是—首先将CSV加载到普通的数据库表(例如mySQL),然后像平常的SQL表一样处理数据

    我已签出csvjdbc。csvjdbc上允许的操作非常有限。我无法执行简单的操作,如按排序和按分组。我已签出csvjdbc。csvjdbc上允许的操作非常有限。我无法执行简单的操作,如按排序和按gro排序