之前在做一个小的桌面程序时,因为需要读取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();
}
}
}
后记:
再后来我在http://sourceforge.net/projects/csvjdbc/上看到mfrasca一直在checkin源代码,聊了下,才发现他好像已经解决了我这个问题,而且还增加了对“Where”等条件SQL 语句的支持,具体更新了那些我不是很清楚,我请求他release新的版本、更新点和文档,不过目前看来好像只release了jar,其他文档之类的还没有。
没时间追了,不然可以好好分析分析实现原理等等的。
分享到:
相关推荐
发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来帮忙解析csv文件...
本篇将详细介绍如何在Java中解析CSV文件,并以给定的"Java解析CSV文件"主题为例,结合提供的资源——`lucky_number_format.csv`、`javacsv-2.0.jar`和`CsvUtil.java`进行深入探讨。 首先,我们来看`javacsv-2.0.jar...
`javacsv`库是处理CSV文件的一种工具,特别是`CsvReader`类,它提供了方便的方法来读取和解析这些文件。 `CsvReader`是`javacsv`库中的核心类,用于读取CSV文件并将其内容转换为Java对象。这个库由`csv`和`java`...
csvjdbc是一款开源的Java驱动程序,它允许我们像操作标准数据库一样处理CSV文件,无需将CSV数据转换为传统的数据库格式。它提供了一个JDBC(Java Database Connectivity)驱动,使得通过SQL语句就能直接对CSV文件...
Java 使用 JDBC 将数据库数据导出到 CSV 文件 Java 是一种广泛使用的编程语言,它提供了多种方式来处理数据库数据,而 JDBC(Java Database Connectivity)是 Java 中连接数据库的标准 API 之一。将数据库数据导出...
在Java中,处理CSV文件通常需要借助第三方库,如本案例中的`javacsv`库,版本2.1。这个库提供了一系列方法来帮助我们方便地解析和生成CSV数据。 `javacsv`库由Jonathan Leffler开发,它允许开发者通过简单的API读取...
接下来,我们关注文件解析。对于Excel文件,Java有Apache POI库提供支持。Apache POI是一个用于读写Microsoft Office格式档案的API,包括Excel。对于Excel 2003(.xls)和2007(.xlsx)格式,POI提供了不同的工作簿...
本篇文章将详细探讨如何在Java中解析CSV文件,并解决中文乱码的问题。 首先,我们需要了解如何使用Java的标准库`java.io`和`java.nio`来读取CSV文件。最常用的是使用`BufferedReader`配合`Scanner`或者`Files.lines...
本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言进行示例,同时引入第三方库来辅助处理编码问题。 首先,创建CSV文件的基本过程涉及将数据写入具有特定分隔...
这个包非常好,能处理特殊字符和换行符的问题,自己写的话很容易在特殊字符和换行符上出问题,建议用高人写的jar包。
用jdbc 连接并读取 csv JDBC driver for CSV files CsvJdbc is a simple read-only JDBC driver that uses Comma Separated Value (CSV) files as database tables. It is ideal for writing data importing ...
2. CSV文件解析: CSV(Comma Separated Values)文件是一种常见的数据交换格式,通常用于导入和导出表格数据。Java中,可以使用OpenCSV或者Apache Commons CSV库来解析CSV文件。解析过程通常包括打开文件、创建...
javacsv-2.0.jar包提供了CsvReader和CsvWriter两个类,分别用于读取和写入CSV文件。在本例子中,我们将展示如何使用javacsv-2.0.jar包来读取和写入CSV文件。 首先,我们需要下载javacsv-2.0.jar包,并将其添加到...
本项目实现了一个基于C++的CSV文件解析器,采用有限状态机(Finite State Machine, FSM)的设计模式。有限状态机是一种计算模型,用于描述和设计具有固定数量状态的系统,这些状态可以根据特定输入进行转换。在CSV...
文件中包括读取excel、csv文件,同时可以将读取出的文件内容保存在另外一个excel或csv中。注意excel2003和excel2007调用的jar包也不一样,需要将代码进行修改。2007版的将HSSF改成XSSF,2003相反。csv文件用XSSF
这个“csv文件解析小工具”是专为处理这类文件而设计的,允许用户直接运行并解析CSV内容。 解析CSV文件的主要挑战在于处理各种边缘情况,例如: 1. **字段内包含逗号**:当某个字段值本身含有逗号时,通常会用双...
在Java编程中,CSV(Comma Separated Values)文件是一种常用的格式,用于存储表格数据,如电子表格或数据库。然而,当处理包含中文字符的CSV文件时,可能会遇到乱码问题。这个问题通常与字符编码设置有关,特别是...
java导出数据时,如果对数据格式没有特殊要求,为了提高效率可以导出CSV格式的文件,导出CSV文件不支持多个sheet页。