解析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 --
分享到:
相关推荐
Learn how Java principles and technology make the best use of modern hardware and operating systems Explore several performance tests and common anti-patterns that can vex your team Understand the ...
Java, Java, Java:java,java,java.pdf
李刚 著 ISBN:9787115263049
Java安卓:猜地鼠游戏.zipJava安卓:猜地鼠游戏.zipJava安卓:猜地鼠游戏.zip Java安卓:猜地鼠游戏.zipJava安卓:猜地鼠游戏.zipJava安卓:猜地鼠游戏.zip Java安卓:猜地鼠游戏.zipJava安卓:猜地鼠游戏.zipJava...
常见编程语言:JAVA:JAVA数据结构
先把dingtalk-sdk-java安装到本地的 maven库里面, 再到pom.xml里添加一下。 在官网下载一份jar : https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02 解压,再修改下面命令里面的路径后执行: mvn install:...
主要介绍了IDEA解决Java:程序包xxxx不存在的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:学生宿舍管理系统源码 Java毕业设计:...
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1321) at org.apache.commons.httpclient.HttpMethodDirector....
csv导出导入工具类,用于导出和导入csv文件的工具类,非要说50个字的描述,办不到啊,没这么多话,自己看
Usage.java:ThreadStates (枚举类型)和ThreadStatesConstant(类) ThreadStates.java :枚举类型 ThreadStatesConstant.java :类 ThreadStatesEnum.java :枚举类型정리및枚举类型 JavaEnumExample.java :
Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...
### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatch...
Java是一个广泛使用的编程语言,以下是一些常见的Java资源: 官方资源: Oracle Java SE Documentation:官方的Java SE文档,提供了Java语言的详细信息。 Java Tutorials:官方的Java教程,提供了Java语言的入门和...
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 ...
Java毕业设计:校园茶舍点餐系统源码 Java毕业设计:校园茶舍点餐系统源码 Java毕业设计:校园茶舍点餐系统源码 Java毕业设计:校园茶舍点餐系统源码 Java毕业设计:校园茶舍点餐系统源码 Java毕业设计:校园...
### 并发编程在Java中的设计原则与模式 #### 一、并发编程概述与Java平台支持 本书《Concurrent Programming in Java™: Design Principles and Patterns 2nd》由Doug Lea编写,出版于1999年,是关于Java并发编程...