解析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 --
分享到:
相关推荐
先把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毕业设计:学生宿舍管理系统源码 Java毕业设计:...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,而`mysql-connector-java-5.1.32`则是MySQL提供的一款用于Java应用程序与MySQL数据库进行交互的驱动程序。这个驱动程序,也被称为JDBC(Java Database ...
### 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...
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)是淘宝开放平台为开发者提供的一套用于集成淘宝服务的Java开发工具包。这个SDK使得Java开发者能够方便地与淘宝API进行交互,实现各种功能,如商品管理、订单处理、用户授权等。在2014年4月8日,淘宝...
《单元测试之道Java版:使用JUnit》PDF 下载
### 并发编程在Java中的设计原则与模式 #### 一、并发编程概述与Java平台支持 本书《Concurrent Programming in Java™: Design Principles and Patterns 2nd》由Doug Lea编写,出版于1999年,是关于Java并发编程...
java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的坦克大战游戏 java课程设计:基于Java 编写的...
java操作MySQL数据库所必需的一个连接器,下载完毕后将mysql-connector-java-8.0.17.jar导入到项目中即可,并且add as library,就可以使用jar包实现与MySQL的连接
fastdfs在java中集成需要用的jar包1.27-SNAPSHOT版本。
protobuf-java-3.2.0.jar
java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股文编程.zip java八股文:Java实现八股...
《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-...
taobao-sdk-java-auto.jar工具类,taobao-sdk-java-auto.jar工具类