之前在做一个小的桌面程序时,因为需要读取csv文件(","分隔)中的数据,所以查到了csvjdbc这个开源包:
http://sourceforge.net/projects/csvjdbc/
csvjdbc说的简单点就是将csv中的表格内容(一般都是类似于一个数据表格)当做数据库的Table,通过自封装的引擎驱动(类似于jdbc)去解析, 也就是说:用户可以使用“SELECT * FROM table”这样的语句来获取csv文件中的数据。
一 csvjdbc原版
我当时拿到的版本还是由 jackerm等人开发的最初的版本,实现的是非常简单的功能,仅仅是“SELECT * FROM table”,不支持"Where"等条件操作。而且csv文件中的内容也必须非常简单。
以下举例说明:
1. csv文件
2. Test java Code: 下面的注释很清楚我就不多说了
二 csvjdbc改动
我发现我要解析的csv文件的头行(非数据行)不仅仅就1行,这种情况下原来的csvjdbc是没法满足这种情况的。于是准备着手修正csvjdbc来fix这个问题:
1.csv 文件
2. csvjdbc
下载其源码分析了下,改动还是非常简单的,只需要增加一个prop属性:"ignoreHeaderLineNumber",该属性用于定义你所需要忽略的头行的行数。具体就不罗嗦了,大家可以看附件中的源代码。
3. Test java代码,需要传入“ignoreHeaderLineNumber”属性
[b]后记:[/b]
再后来我在http://sourceforge.net/projects/csvjdbc/上看到mfrasca一直在checkin源代码,聊了下,才发现他好像已经解决了我这个问题,而且还增加了对“Where”等条件SQL 语句的支持,具体更新了那些我不是很清楚,我请求他release新的版本、更新点和文档,不过目前看来好像只release了jar,其他文档之类的还没有。
没时间追了,不然可以好好分析分析实现原理等等的。
http://sourceforge.net/projects/csvjdbc/
csvjdbc说的简单点就是将csv中的表格内容(一般都是类似于一个数据表格)当做数据库的Table,通过自封装的引擎驱动(类似于jdbc)去解析, 也就是说:用户可以使用“SELECT * FROM table”这样的语句来获取csv文件中的数据。
一 csvjdbc原版
我当时拿到的版本还是由 jackerm等人开发的最初的版本,实现的是非常简单的功能,仅仅是“SELECT * FROM table”,不支持"Where"等条件操作。而且csv文件中的内容也必须非常简单。
以下举例说明:
1. csv文件
ipAddress,macAddress,userName
192.168.1.2,00-00-00-00-00-00,X
192.168.1.3,00-00-00-00-00-01,Y
192.168.1.4,00-00-00-00-00-02,Z
...
...
...
2. Test java Code: 下面的注释很清楚我就不多说了
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class TestCsvJdbcConn {
/**
* CSV JDBC驱动
*/
private static final String CSV_JDBC_DRIVER = "org.relique.jdbc.csv.CsvDriver";
/**
* jdbc连接csv的 Header
*/
private static final String CSV_JDBC_HEADER = "jdbc:relique:csv:";
/**
* separator 参数设置: CSV 文件中数据分割符
*/
private static final String CSV_PROP_SEPARATOR = "separator";
/**
* separator 参数设置: 首行包含数据否
*/
private static final String CSV_PROP_SUPHEADER = "suppressHeaders";
/**
* fileExtension 参数设置: 文件类型
*/
private static final String CSV_PROP_FILEEXTEN = "fileExtension";
/**
* charset 参数设置: 字符集
*/
private static final String CSV_PROP_CHARSET = "charset";
/**
* 使用CSV JDBC驱动解析CSV文件
* parse
* @param csvDirectory String CSV文件所在目录
* @param csvName String CSV文件名(不包含文件类型)
*/
public final static void parse(final String csvDirectory, final String csvName) {
try {
// 加载CSV-JDBC驱动
Class.forName(CSV_JDBC_DRIVER);
// 解析CSV前的一些准备工作:解析参数设置
final Properties props = new java.util.Properties();
// 该CSV的数据是由','分隔
props.put(CSV_PROP_SEPARATOR, ",");
// 首行(去掉上面头行后的第一行)包含数据
props.put(CSV_PROP_SUPHEADER, "false");
// 要解析的文件类型
props.put(CSV_PROP_FILEEXTEN, ".csv");
// 字符集
props.put(CSV_PROP_CHARSET, "UTF-8");
// 创建一个connection. The first command line parameter is assumed to
// be the directory in which the .csv files are held
final Connection conn = DriverManager.getConnection(CSV_JDBC_HEADER
+ csvDirectory, props);
// create a Statement object to execute the query with
final Statement stmt = conn.createStatement();
// Select the ID and NAME columns from sample.csv
final ResultSet results =
stmt.executeQuery("SELECT "
+ " ipAddress macAddress userName "
+ " FROM "
+ csvName );
int i = 0;
while (results.next()) {
i++;
System.out.println(results.getString("ipAddress"));
}
// clean up
results.close();
stmt.close();
conn.close();
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final SQLException e) {
e.printStackTrace();
}
}
}
二 csvjdbc改动
我发现我要解析的csv文件的头行(非数据行)不仅仅就1行,这种情况下原来的csvjdbc是没法满足这种情况的。于是准备着手修正csvjdbc来fix这个问题:
1.csv 文件
Date:2010-06-17 17:00:00
User:WWW
CopyRight: XXX
ipAddress,macAddress,userName
192.168.1.2,00-00-00-00-00-00,X
192.168.1.3,00-00-00-00-00-01,Y
192.168.1.4,00-00-00-00-00-02,Z
...
...
...
2. csvjdbc
下载其源码分析了下,改动还是非常简单的,只需要增加一个prop属性:"ignoreHeaderLineNumber",该属性用于定义你所需要忽略的头行的行数。具体就不罗嗦了,大家可以看附件中的源代码。
3. Test java代码,需要传入“ignoreHeaderLineNumber”属性
public class TestCsvJdbcConn {
/**
* CSV JDBC驱动
*/
private static final String CSV_JDBC_DRIVER = "org.relique.jdbc.csv.CsvDriver";
/**
* jdbc连接csv的 Header
*/
private static final String CSV_JDBC_HEADER = "jdbc:relique:csv:";
/**
* separator 参数设置: CSV 文件中数据分割符
*/
private static final String CSV_PROP_SEPARATOR = "separator";
/**
* separator 参数设置: 首行包含数据否
*/
private static final String CSV_PROP_SUPHEADER = "suppressHeaders";
/**
* fileExtension 参数设置: 文件类型
*/
private static final String CSV_PROP_FILEEXTEN = "fileExtension";
/**
* charset 参数设置: 字符集
*/
private static final String CSV_PROP_CHARSET = "charset";
/**
* ignoreHeaderLineNumber 参数设置: CSV文件头行数
*/
private static final String CSV_PROP_HEADERNUM = "ignoreHeaderLineNumber";
/**
* 使用CSV JDBC驱动解析CSV文件
* parse
* @param csvDirectory String CSV文件所在目录
* @param csvName String CSV文件名(不包含文件类型)
*/
public final static void parse(final String csvDirectory, final String csvName) {
try {
// 加载CSV-JDBC驱动
Class.forName(CSV_JDBC_DRIVER);
// 解析CSV前的一些准备工作:解析参数设置
final Properties props = new java.util.Properties();
// 该CSV的数据是由','分隔
props.put(CSV_PROP_SEPARATOR, ",");
// 无用的头行总共几行(不包含列名的行)
props.put(CSV_PROP_HEADERNUM, "3");
// 首行(去掉上面头行后的第一行)包含数据
props.put(CSV_PROP_SUPHEADER, "false");
// 要解析的文件类型
props.put(CSV_PROP_FILEEXTEN, ".csv");
// 字符集
props.put(CSV_PROP_CHARSET, "UTF-8");
// 创建一个connection. The first command line parameter is assumed to
// be the directory in which the .csv files are held
final Connection conn = DriverManager.getConnection(CSV_JDBC_HEADER
+ csvDirectory, props);
// create a Statement object to execute the query with
final Statement stmt = conn.createStatement();
// Select the ID and NAME columns from sample.csv
final ResultSet results =
stmt.executeQuery("SELECT "
+ " ipAddress macAddress userName "
+ " FROM "
+ csvName );
int i = 0;
while (results.next()) {
i++;
System.out.println(results.getString("ipAddress"));
}
System.out.println("i = " + i);
// clean up
results.close();
stmt.close();
conn.close();
} catch (final ClassNotFoundException e) {
e.printStackTrace();
} catch (final SQLException e) {
e.printStackTrace();
}
}
}
[b]后记:[/b]
再后来我在http://sourceforge.net/projects/csvjdbc/上看到mfrasca一直在checkin源代码,聊了下,才发现他好像已经解决了我这个问题,而且还增加了对“Where”等条件SQL 语句的支持,具体更新了那些我不是很清楚,我请求他release新的版本、更新点和文档,不过目前看来好像只release了jar,其他文档之类的还没有。
没时间追了,不然可以好好分析分析实现原理等等的。