使用CSV文件而不是SQL语句创建Java ResultSet

时间:2018-08-09 16:37:16

标签: java sql csv resultset

我想使用结果集来保存我的用户数据。只有一个皱纹-数据采用CSV(逗号分隔)格式,而不是数据库中。

CSV文件在顶部包含一个标题行,然后是数据行。我想动态创建结果集,但不使用SQL查询。输入将是CSV文件。

根据我的Java经验,我期望会有rs.newRowrs.newColumnrs.updateRow等方法,因此我可以使用结果集的结构而无需首先进行任何数据库查询。

结果集上有这种方法吗?我阅读了文档,但没有找到任何方法。仅从CSV构建结果集,然后像执行SQL查询一样使用它,这将非常有用。我发现很难使用Java bean,bean的数组列表等-因为我想读取结构不同的CSV文件,相当于SQL中的SELECT * FROM

我不知道列的名称或数量会是多少。因此,诸如“向Java ResultSet手动添加数据”之类的其他SO问题无法满足我的需求。在那种情况下,他已经有一个SQL创建的结果集,并且想要添加行。

在我的情况下,我想从头开始创建结果集,并在读入第一行时添加列。现在,我正在考虑这一点,我可以使用类似下面的语句从第一行创建查询SELECT COL1, COL2, COL3 ... FROM哑巴。然后使用INSERT ROW语句读取并插入其余部分。 (稍后:)但是尝试这样做会失败,因为没有实际的表关联。

2 个答案:

答案 0 :(得分:3)

CsvJdbc开源项目应该做到这一点:

// Load the driver.
Class.forName("org.relique.jdbc.csv.CsvDriver");

// Create a connection using the directory containing the file(s)
Connection conn = DriverManager.getConnection("jdbc:relique:csv:/path/to/files");

// Create a Statement object to execute the query with.
Statement stmt = conn.createStatement();

// Query the table. The name of the table is the name of the file without ".csv"
ResultSet results = stmt.executeQuery("SELECT col1, col2 FROM myfile");

答案 1 :(得分:2)

与@Mureinik的想法互补的另一种想法是,我觉得真的很好。

或者,您可以使用任何CSV Reader库(其中很多库),并使用任何内存数据库(例如 H2 )将文件加载到内存表中HyperSQL Derby 等。这些为您提供了完整/完整的SQL引擎,您可以在其中运行高端/复杂查询。

这需要更多的工作,但是之后您可以灵活使用数据。

尝试使用内存中的解决方案后,切换到持久数据库确实非常容易(只需更改URL)。这样,您只能将CSV文件加载一次到数据库中。在第二次执行之后,数据库将可以使用;无需再次加载CSV。