csv 的读取

csv 文件准备

我在在 h2-*.jar 相同目录下准备一个 csv 文件:

  • user.csv
id,name,password
1,ryo,123456

sql 读取 csv 执行

sql> SELECT * FROM CSVREAD('user.csv');

ID | NAME | PASSWORD
1  | ryo  | 123456
(1 row, 57 ms)

导入 csv 文件

命令

CREATE TABLE TEST1 AS SELECT * FROM CSVREAD('user.csv');

CREATE TABLE TEST2(ID INT PRIMARY KEY, NAME VARCHAR(255), PASSWORD VARCHAR(255)) AS SELECT * FROM CSVREAD('user.csv');

查看

sql> select * from TEST1;
ID | NAME | PASSWORD
1  | ryo  | 123456
(1 row, 4 ms)

sql> select * from TEST2;
ID | NAME | PASSWORD
1  | ryo  | 123456
(1 row, 0 ms)

导出 csv 文件

命令

CALL CSVWRITE('user_bak.csv', 'SELECT * FROM TEST1');

文件内容

"ID","NAME","PASSWORD"
"1","ryo","123456"

java 代码实现 csv 读写

写入

SimpleResultSet rs = new SimpleResultSet();
rs.addColumn("NAME", Types.VARCHAR, 255, 0);
rs.addColumn("EMAIL", Types.VARCHAR, 255, 0);
rs.addRow("Bob Meier", "bob.meier@abcde.abc");
rs.addRow("John Jones", "john.jones@abcde.abc");
new Csv().write("test.csv", rs, null);
  • 生成的文件

test.csv 文件如下:

"NAME","EMAIL"
"Bob Meier","bob.meier@abcde.abc"
"John Jones","john.jones@abcde.abc"

读取

ResultSet rs = new Csv().read("test.csv", null, null);
ResultSetMetaData meta = rs.getMetaData();
while (rs.next()) {
    for (int i = 0; i < meta.getColumnCount(); i++) {
        System.out.println(
                meta.getColumnLabel(i + 1) + ": " +
                        rs.getString(i + 1));
    }
    System.out.println();
}

rs.close();

输出信息

NAME: Bob Meier
EMAIL: bob.meier@abcde.abc

NAME: John Jones
EMAIL: john.jones@abcde.abc

小结

csv 作为数据库存储常用的格式,h2 提供了非常方便的工具类。

这种可以脱离数据库使用的高度抽象是非常优秀的设计理念,值得我们学习。