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

Posted

技术标签:

【中文标题】加载位于 H2 数据库的类路径中的 CSV 文件【英文标题】:Load CSV file located in the classpath for H2 Database 【发布时间】:2011-07-25 09:13:19 【问题描述】:

出于测试目的,我想使用 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。

【问题讨论】:

【参考方案1】:

对上述答案的更新。

我尝试了上面提供的解决方案,但是我仍然收到错误,然后我尝试了以下方法并且它有效。

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

H2 数据库文档需要更新。

【讨论】:

【参考方案2】:

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

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

这是工作

【讨论】:

嗯,听起来像个bug……我会检查的。

以上是关于加载位于 H2 数据库的类路径中的 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

H2数据库加载csv数据更快

H2 数据库 - CSVREAD - 跳过将 csv 文件的标题行加载到数据库中

加载plist文件数据的方法

如何获取目录下的文件数(一行Python)

如何访问位于源文件夹中的 Jar 文件?

如何计算每个目录中的文件数?