加载位于H2数据库的类路径中的CSV文件

时间:2011-03-29 15:02:15

标签: java testing h2 in-memory-database

出于测试目的,我想使用SQL脚本和CSV文件创建和填充一些表。

所以我创建了一个像这样的SQL脚本:

CREATE TABLE T_FOO (
  ...
) as select * from CSVREAD('classpath:/foo.csv');

foo.csv文件存在,位于src/test/resources

当这个脚本在Eclipse上运行时(其中src/test/resources被定义为源目录并因此包含在类路径中),我收到以下错误:

Caused by: java.io.FileNotFoundException: resource /foo.csv
    at org.h2.store.fs.FileSystemDisk.openFileInputStream(FileSystemDisk.java:388)
    at org.h2.util.IOUtils.openFileInputStream(IOUtils.java:708)
    at org.h2.tools.Csv.initRead(Csv.java:317)
    at org.h2.tools.Csv.readResultSet(Csv.java:217)
    at org.h2.tools.Csv.read(Csv.java:193)
    ... 49 more

我做错了什么?如何正确使用classpath:协议加载CSV文件?

如果我放置文件的完整路径(如... CSVREAD('C:\my-project\src\test\resources\foo.csv');),那么它可以工作。但这不是我想做的原因:))

请注意,我使用最新版本的H2( 1.3.153 )作为I wanted to use the classpath: protocol to load my file

2 个答案:

答案 0 :(得分:12)

即使the official docs给出CSVREAD('classpath:/org/acme/data/address.csv')示例,Sean Patrick Floyd建议删除前导斜杠,即:

CREATE TABLE T_FOO (
  ...
) as select * from CSVREAD('classpath:foo.csv');

这是正常工作

答案 1 :(得分:0)

上述答案的更新。

我尝试了上面提供的解决方案,但是仍然出现错误,然后尝试了下面的方法,它就可以了。

Create table tblcountry as select * from CSVREAD('classpath:/country.csv');

H2数据库文档需要更新。