`
terrencexu
  • 浏览: 122706 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java: CSVUtils

    博客分类:
  • Java
阅读更多

解析CSV文件,最简单,最直接,最突然的想法就是

 

"a,b,c,d".split(",")

 

但是如果复杂一点儿,加上一些特殊字符,比如引号“"”,逗号“,”,那你就会发现split(",")不灵光了。于是今天就闲着没事儿写了一个,没有完全测试,但是应该没问题,哈哈

package com.javaeye.terrencexu.csv

import java.util.LinkedList;
import java.util.List;

public final class CSVUtils {

	private CSVUtils() {}
	
	private static char fieldSep = ',';

	private static List<String> fields = null;

	/**
	 * This function will split the input on commas. It needs to decide whether
	 * to parse normally or consider special scenarios like "AA,BB". This
	 * function returns the number of fields present in the input.
	 * 
	 * @param line
	 * @return
	 */
	public static List<String> split(String line) {
		fields = new LinkedList<String>();
		
		if (line.length() == 0) {
			return null;
		}
		
		int curPos = 0;
		
		while(curPos <= line.length()) {
			if (curPos < line.length() && line.charAt(curPos) == '"') {
				curPos = parseQuoted(line, ++curPos);
			} else {
				curPos = parsePlain(line, curPos);
			}

			curPos ++;
		}

		return fields;
	}
	
	public static List<String> split(String line, char separator) {
		fieldSep = separator;
		
		return split(line);
	}

	/**
	 * This function will parse all fields that are not in quotes.
	 * 
	 * @param line
	 * @param curPos
	 * @return
	 */
	private static int parsePlain(String line, int curPos) {
		int nextSepPos;

		nextSepPos = line.indexOf(fieldSep, curPos);

		if (nextSepPos == -1) {
			fields.add(line.substring(curPos));
			return line.length();
		} else {
			fields.add(line.substring(curPos, nextSepPos));
		}
		
		return nextSepPos;
	}

	/**
	 * This function will parse all fields that are in quotes.
	 * 
	 * @param line
	 * @param curPos
	 * @return
	 */
	private static int parseQuoted(String line, int curPos) {
		int tmpPos;
		String fld = "";
		
		for (tmpPos = curPos; tmpPos < line.length(); tmpPos++) { 
			if (line.charAt(tmpPos) == '"' && tmpPos + 1 < line.length()) { 
				if (line.charAt(tmpPos + 1) == '"') { 
					tmpPos++; 
				} else if (line.charAt(tmpPos + 1) == fieldSep) { 
					tmpPos++;
					break;
				}
				
			} else if (line.charAt(tmpPos) == '"' && tmpPos + 1 == line.length()) {
				break;
			}
			
			fld = fld + line.charAt(tmpPos); 
		}
		
		fields.add(fld);
		
		return tmpPos;
	}

}

 

测试一把:

public static void main(String[] args) {
	String line = "col_1,Test,\"{\"\"key\"\":\"\"date\"\",\"\"order\"\":\"\"desc\"\"}\",,,,application/xml";
	String line2 = "a|b|\"|\"|d";
	
	System.out.println(CSVUtils.split(line));
	System.out.println(CSVUtils.split(line2, '|'));
}

 运行结果:

[col_1, Test, {"key":"date","order":"desc"}, , , , application/xml]

[a, b, |, d]

 

 -- Done --

 

3
3
分享到:
评论

相关推荐

    dingtalk-sdk-java.zip

    先把dingtalk-sdk-java安装到本地的 maven库里面, 再到pom.xml里添加一下。 在官网下载一份jar : https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02 解压,再修改下面命令里面的路径后执行: mvn install:...

    IDEA解决Java:程序包xxxx不存在的问题

    主要介绍了IDEA解决Java:程序包xxxx不存在的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    java:大数据文件写入,读取,分割,排序,合并

    java:大数据文件写入,读取,分割,排序,合并

    Java毕业设计:学生宿舍管理系统源码.zip

    Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:...

    mysql-connector-java-5.1.32

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,而`mysql-connector-java-5.1.32`则是MySQL提供的一款用于Java应用程序与MySQL数据库进行交互的驱动程序。这个驱动程序,也被称为JDBC(Java Database ...

    java错误处理:java.lang.OutOfMemoryError: Java heap space

    ### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....

    swing-worker-1.1.jar

    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatch...

    dubbo-2.8.4.jar

    at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.returnFromResponse(DefaultFuture.java:190) at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:110) at ...

    淘宝SDK(java)

    淘宝SDK(Java)是淘宝开放平台为开发者提供的一套用于集成淘宝服务的Java开发工具包。这个SDK使得Java开发者能够方便地与淘宝API进行交互,实现各种功能,如商品管理、订单处理、用户授权等。在2014年4月8日,淘宝...

    《单元测试之道Java版:使用JUnit》PDF 下载

    《单元测试之道Java版:使用JUnit》PDF 下载

    Concurrent Programming in Java™: Design Principles and Patterns 2nd

    ### 并发编程在Java中的设计原则与模式 #### 一、并发编程概述与Java平台支持 本书《Concurrent Programming in Java™: Design Principles and Patterns 2nd》由Doug Lea编写,出版于1999年,是关于Java并发编程...

    java课程设计:基于Java 编写的坦克大战游戏.zip

    java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的...

    mysql-connector-java-8.0.17.zip

    java操作MySQL数据库所必需的一个连接器,下载完毕后将mysql-connector-java-8.0.17.jar导入到项目中即可,并且add as library,就可以使用jar包实现与MySQL的连接

    fastdfs-client-java-1.27-SNAPSHOT.jar

    fastdfs在java中集成需要用的jar包1.27-SNAPSHOT版本。

    protobuf-java-3.2.0.jar

    protobuf-java-3.2.0.jar

    Java实现八股文编程.zip

    java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股...

    Java银行管理系统+MySQL

    《Java银行管理系统+MySQL》是基于JAVA编程语言和MySQL数据库技术构建的一款银行管理软件。该系统涵盖了银行日常操作中的核心功能,如开户、存款、取款、转账、修改密码以及销户等,实现了完整的业务流程。以下是这...

    mysql-connector-java-8.0.22.jar

    包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-8.0.22.jar包含mysql-connector-java-...

    taobao-sdk-java-auto.jar

    taobao-sdk-java-auto.jar工具类,taobao-sdk-java-auto.jar工具类

Global site tag (gtag.js) - Google Analytics