[csvjdbc] Java解析csv文件的开源包及改动

之前在做一个小的桌面程序时,因为需要读取csv文件(","分隔)中的数据,所以查到了csvjdbc这个开源包:
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,其他文档之类的还没有。
没时间追了,不然可以好好分析分析实现原理等等的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值