`
woniu1983
  • 浏览: 167780 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
   之前在做一个小的桌面程序时,因为需要读取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,其他文档之类的还没有。
没时间追了,不然可以好好分析分析实现原理等等的。

1
0
分享到:
评论

相关推荐

    java操作csv文件(读、写)

    发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来帮忙解析csv文件...

    Java解析CSV文件

    本篇将详细介绍如何在Java中解析CSV文件,并以给定的"Java解析CSV文件"主题为例,结合提供的资源——`lucky_number_format.csv`、`javacsv-2.0.jar`和`CsvUtil.java`进行深入探讨。 首先,我们来看`javacsv-2.0.jar...

    javacsv_CsvReader:解析CSV文件

    `javacsv`库是处理CSV文件的一种工具,特别是`CsvReader`类,它提供了方便的方法来读取和解析这些文件。 `CsvReader`是`javacsv`库中的核心类,用于读取CSV文件并将其内容转换为Java对象。这个库由`csv`和`java`...

    csvjdbc-r0-10导入示例工程

    csvjdbc是一款开源的Java驱动程序,它允许我们像操作标准数据库一样处理CSV文件,无需将CSV数据转换为传统的数据库格式。它提供了一个JDBC(Java Database Connectivity)驱动,使得通过SQL语句就能直接对CSV文件...

    java使用jdbc将数据库数据导出到csv文件.pdf

    Java 使用 JDBC 将数据库数据导出到 CSV 文件 Java 是一种广泛使用的编程语言,它提供了多种方式来处理数据库数据,而 JDBC(Java Database Connectivity)是 Java 中连接数据库的标准 API 之一。将数据库数据导出...

    csv解析 javacsv2.1解析csv文件的方法

    在Java中,处理CSV文件通常需要借助第三方库,如本案例中的`javacsv`库,版本2.1。这个库提供了一系列方法来帮助我们方便地解析和生成CSV数据。 `javacsv`库由Jonathan Leffler开发,它允许开发者通过简单的API读取...

    文件上传,java解析excel和csv 转javabean

    接下来,我们关注文件解析。对于Excel文件,Java有Apache POI库提供支持。Apache POI是一个用于读写Microsoft Office格式档案的API,包括Excel。对于Excel 2003(.xls)和2007(.xlsx)格式,POI提供了不同的工作簿...

    java 解析csv文件例子,csv文件 中文乱码问题

    本篇文章将详细探讨如何在Java中解析CSV文件,并解决中文乱码的问题。 首先,我们需要了解如何使用Java的标准库`java.io`和`java.nio`来读取CSV文件。最常用的是使用`BufferedReader`配合`Scanner`或者`Files.lines...

    读取创建CSV文件并自动解析文件编码方式

    本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言进行示例,同时引入第三方库来辅助处理编码问题。 首先,创建CSV文件的基本过程涉及将数据写入具有特定分隔...

    csv文件解析工具(javacsv.jar包)

    这个包非常好,能处理特殊字符和换行符的问题,自己写的话很容易在特殊字符和换行符上出问题,建议用高人写的jar包。

    csv jdbc 封装连接csv JDBC driver for CSV files

    用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 ...

    完整实现ftp上传与下载并解析csv文件

    2. CSV文件解析: CSV(Comma Separated Values)文件是一种常见的数据交换格式,通常用于导入和导出表格数据。Java中,可以使用OpenCSV或者Apache Commons CSV库来解析CSV文件。解析过程通常包括打开文件、创建...

    java读取csv例子

    javacsv-2.0.jar包提供了CsvReader和CsvWriter两个类,分别用于读取和写入CSV文件。在本例子中,我们将展示如何使用javacsv-2.0.jar包来读取和写入CSV文件。 首先,我们需要下载javacsv-2.0.jar包,并将其添加到...

    CSV文件格式解析器

    本项目实现了一个基于C++的CSV文件解析器,采用有限状态机(Finite State Machine, FSM)的设计模式。有限状态机是一种计算模型,用于描述和设计具有固定数量状态的系统,这些状态可以根据特定输入进行转换。在CSV...

    java读写excel、csv文件

    文件中包括读取excel、csv文件,同时可以将读取出的文件内容保存在另外一个excel或csv中。注意excel2003和excel2007调用的jar包也不一样,需要将代码进行修改。2007版的将HSSF改成XSSF,2003相反。csv文件用XSSF

    csv文件解析小工具 可直接运行

    这个“csv文件解析小工具”是专为处理这类文件而设计的,允许用户直接运行并解析CSV内容。 解析CSV文件的主要挑战在于处理各种边缘情况,例如: 1. **字段内包含逗号**:当某个字段值本身含有逗号时,通常会用双...

    java读写csv文件,中文乱码问题

    在Java编程中,CSV(Comma Separated Values)文件是一种常用的格式,用于存储表格数据,如电子表格或数据库。然而,当处理包含中文字符的CSV文件时,可能会遇到乱码问题。这个问题通常与字符编码设置有关,特别是...

    Java导出CSV文件

    java导出数据时,如果对数据格式没有特殊要求,为了提高效率可以导出CSV格式的文件,导出CSV文件不支持多个sheet页。

Global site tag (gtag.js) - Google Analytics