【Java/csv】一个CSV文件解析类(转载)
/*下文写得不错,值得学习**/
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* CsvParser
* 此类来自网上方案,并非本人原创,在此表示感谢原作者
* 2013-12-10 21:43:48
*/
public class CsvParser{
// Saved input CSV file pathname
private String inputCsvFile;
// Space mark , ; : etc.
private String spaceMark=",";
/**
* Contructor
* @param inputCsvFile
*/
public CsvParser(String inputCsvFile,String spaceMark){
this.inputCsvFile=inputCsvFile;
this.spaceMark=spaceMark;
}
/**
* Contructor
* @param inputCsvFile
*/
public CsvParser(String inputCsvFile){
this.inputCsvFile=inputCsvFile;
this.spaceMark=",";
}
/**
* Get parsed array from CSV file
* @return
*/
public Object[] getParsedArray() throws Exception{
List<List<String>> retval=new ArrayList<List<String>>();
String regExp = getRegExp();
BufferedReader in = new BufferedReader(new FileReader(this.inputCsvFile));
String strLine;
String str = "";
while ((strLine = in.readLine()) != null) {
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(strLine);
List<String> listTemp = new ArrayList<String>();
while (matcher.find())
{
str = matcher.group();
str = str.trim();
if (str.endsWith(spaceMark))
{
str = str.substring(0, str.length() - 1);
str = str.trim();
}
if (str.startsWith("\"") && str.endsWith("\""))
{
str = str.substring(1, str.length() - 1);
if (CsvParser.isExisted("\"\"", str))
{
str = str.replaceAll("\"\"", "\"");
}
}
if (!"".equals(str))
{
listTemp.add(str);
}
}
// Add to retval
retval.add(listTemp);
}
in.close();
return retval.toArray();
}
/**
* Regular Expression for CSV parse
* @return
*/
private String getRegExp()
{
final String SPECIAL_CHAR_A = "[^\",\\n ]";
final String SPECIAL_CHAR_B = "[^\""+spaceMark+"\\n]";
StringBuffer strRegExps = new StringBuffer();
strRegExps.append("\"((");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*["+spaceMark+"\\n ])*(");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"{2})*)*");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"[ ]*"+spaceMark+"[ ]*");
strRegExps.append("|");
strRegExps.append(SPECIAL_CHAR_B);
strRegExps.append("*[ ]*"+spaceMark+"[ ]*");
strRegExps.append("|\"((");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*["+spaceMark+"\\n ])*(");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"{2})*)*");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"[ ]*");
strRegExps.append("|");
strRegExps.append(SPECIAL_CHAR_B);
strRegExps.append("*[ ]*");
return strRegExps.toString();
}
/**
* If argChar is exist in argStr
* @param argChar
* @param argStr
* @return
*/
private static boolean isExisted(String argChar, String argStr)
{
boolean blnReturnValue = false;
if ((argStr.indexOf(argChar) >= 0)
&& (argStr.indexOf(argChar) <= argStr.length()))
{
blnReturnValue = true;
}
return blnReturnValue;
}
/**
* Test
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_not quoted_1.csv");
//CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_not quoted_2.csv");
//CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_quoted.csv");
//CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_quoted_2.csv");
//CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_1.csv",";");
//CsvParser parser=new CsvParser("C:\\Users\\IBM_ADMIN\\Desktop\\Test CSV Files\\dummydata_2.csv",":");
Object[] arr=parser.getParsedArray();
//System.out.println(arr);
for(Object obj:arr){
System.out.print("[");
List<String> ls=(List<String>)obj;
for(String item:ls){
System.out.println(item+",");
}
System.out.println("],");
}
}
}
解析CSV文件:
Column1,Column2,Column3,Column4,Column5
Roderick Manuel,2013-02-21,59 E Brillhart Ave,67526,branch damage other impulse
Lashonda Frank,2012-11-21,418 US Hwy 100,22609,fowl house
Holly Silva,2013-09-15,16345 Old Jacksboro Hwy,13140,art sand colour tray boiling
Martin Forbes,2013-04-28,69 Spr 33,91656,bag point necessary country
Josefa Berry,2008-08-21,125 Hwy' 84 E,12604,Sort industry married safe shirt
Allyson Green,2004-11-11,425 Ranch Rd 587,35059,mother political
Tim Hopkins,2005-03-17,9559 I- 820,83598,crush. surprise station' distance from
Olen Abbott,2009-02-17,2249 Westwood Dr N,15575,acid
Ana Fowler,2011-02-19,22 State Loop 426,13409,memory poor farm adjustment
Minerva House,2009-02-18,57151 Collett Rd,45782,dry summer
将解析完得到的数组输出如下:
[Column1,
Column2,
Column3,
Column4,
Column5,
],
[Roderick Manuel,
2013-02-21,
59 E Brillhart Ave,
67526,
branch damage other impulse,
],
[Lashonda Frank,
2012-11-21,
418 US Hwy 100,
22609,
fowl house,
],
[Holly Silva,
2013-09-15,
16345 Old Jacksboro Hwy,
13140,
art sand colour tray boiling,
],
[Martin Forbes,
2013-04-28,
69 Spr 33,
91656,
bag point necessary country,
],
[Josefa Berry,
2008-08-21,
125 Hwy' 84 E,
12604,
Sort industry married safe shirt,
],
[Allyson Green,
2004-11-11,
425 Ranch Rd 587,
35059,
mother political,
],
[Tim Hopkins,
2005-03-17,
9559 I- 820,
83598,
crush. surprise station' distance from,
],
[Olen Abbott,
2009-02-17,
2249 Westwood Dr N,
15575,
acid,
],
[Ana Fowler,
2011-02-19,
22 State Loop 426,
13409,
memory poor farm adjustment,
],
[Minerva House,
2009-02-18,
57151 Collett Rd,
45782,
dry summer,
],
我自己的解决方案:https://www.cnblogs.com/xiandedanteng/p/11915324.html
【Java/csv】一个CSV文件解析类(转载)的更多相关文章
- 【转】Java压缩和解压文件工具类ZipUtil
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- 自己用的框架写了一个PHP模版解析类
<?php if(!defined('IS_HEARTPHP')) exit('Access Denied'); /** * template.class.php 模板解析类 * * @copy ...
- C语言中.h和.c文件解析(转载)
转载:http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html 简单的说其实要理解C文件与头文件(即.h)有什么不同之处, ...
- Java IO编程——File文件操作类
在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一 一个与文件本身操作(创建.删除.重命名等 ...
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
- 自定义报告,用Java写一个html文件
因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...
- java===编译引用第三方文件的类(原创)
http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...
- 一个CSV文件解析类
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.ut ...
- java中IO写文件工具类
以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...
随机推荐
- css选择器找亲戚
1.first-child first-child表示选择列表中的第一个标签.代码如下: li:first-child{background:#090} 上面的意思是,li 列表中的 第一个li模块的 ...
- 选择webpack这条路,我踩过的坑
在http://www.jianshu.com/p/42e11515c10f这篇文章,我重新学习了一下webpack. 一.json文件里面不应该含有注释,否则会报错 本来我的json文件长这个样子: ...
- MYSQL AND 和 OR
AND 和 OR 如果你失忆了,希望你能想起曾经为了追求梦想的你. QQ群:651080565(php/web 学习课堂) 我们查询数据的时候,会使用条件来过滤数据,达到筛选效果,过 ...
- 揭秘如何用Python黑掉智能锅炉
引文 去年我买了一个新的冷凝式锅炉(家用取暖产品),于是考虑上面必须有一个“智能恒温器”,而选择也很多,包括Google Nest. Hive(英国天然气公司设计的) 以及伍斯特·博世‘Wave’ ...
- 关于join() 是否会释放锁的一些思考
# 首先从一个很有意思的问题开始: - 问 : Thread 的join() 方法是否会释放锁? - 答: 会! # 如果一切到这里就结束了,那可能也就没有这篇小记了,但是我的脑子却冒出了一些奇怪的想 ...
- wampserver apache 500 Internal Server Error解决办法
Internal Server ErrorThe server encountered an internal error or misconfiguration and was unable to ...
- Tomcat下配置JNDI的三种方式
最近在整理项目上的配置文件,正好看到了数据源配置,想着配置方式有多种,便趁热打铁,记录下常规的Tomcat配置数据源的方式 1.单个工程配置 找到Tomcat下的server.xml文件,在Conte ...
- C# 反射 (15)
本章要点 自定义特性 反射 自定义特性运行把自定义元数据与程序元素关联起来.这些元数据时再编译过程中创建的并嵌入到程序集中. 反射是计算机术语,它描述在运行过程中检查和处理程序元素的功能. 反射允许完 ...
- 前端知识体系:JavaScript基础-一个原型继承例子
function Elem(id) { this.elem = document.getElementById(id); } Elem.prototype.html = function(val){ ...
- stm32——modbus例程网址收藏
https://blog.csdn.net/baidu_31437863/article/details/82178708 STM32(五) Modbus https://blog.csdn.net/ ...