/*下文写得不错,值得学习**/

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文件解析类(转载)的更多相关文章

  1. 【转】Java压缩和解压文件工具类ZipUtil

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  2. 自己用的框架写了一个PHP模版解析类

    <?php if(!defined('IS_HEARTPHP')) exit('Access Denied'); /** * template.class.php 模板解析类 * * @copy ...

  3. C语言中.h和.c文件解析(转载)

    转载:http://www.cnblogs.com/laojie4321/archive/2012/03/30/2425015.html   简单的说其实要理解C文件与头文件(即.h)有什么不同之处, ...

  4. Java IO编程——File文件操作类

    在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一 一个与文件本身操作(创建.删除.重命名等 ...

  5. android基础篇------------java基础(11)(文件解析xml and Json )

    一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...

  6. 自定义报告,用Java写一个html文件

    因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...

  7. java===编译引用第三方文件的类(原创)

    http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...

  8. 一个CSV文件解析类

    import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.ut ...

  9. java中IO写文件工具类

    以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...

随机推荐

  1. Linux系统从新手到运维老鸟学习指南

    Linux是在1990年底到1991年由芬兰大学的学生LinusTorvalds利用Minix操作系统作为开发平台编写了内核,目前由世界各地的爱好者共同开发和维护的与UNIX兼容的操作系统,也是自由和 ...

  2. 在idea中相同的字符串使用equals()进行比较时,返回值是flase问题

    最近在idea中遇到了一个编码的问题,我的程序是从前台传过来一个字符串,判断用户的角色(学生,教师,管理员), 在进行equals()判断时,返回的确是false,然后就在网上查了查,发现是编码的问题 ...

  3. PAT Basic 1049 数列的片段和 (20 分)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) ...

  4. [SDOI2008]山贼集团

    题目描述 某山贼集团在绿荫村拥有强大的势力,整个绿荫村由\(N\)个连通的小村落组成,并且保证对于每两个小村落有且仅有一条简单路径相连. 小村落用阿拉伯数字编号为\(1,2,3,4, \dots ,n ...

  5. 前端知识体系:JavaScript基础-原型和原型链-理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题

    理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题(原文文档) 1.什么是执行上下文: 简而言之,执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,Java ...

  6. python打开excel跳转对应分页

    需求: 在python脚本层,直接打开excel,跳转特定分页,方便策划编辑 尝试了几种不同的方法,最终选择了方法4.4种方法都可以实现打开外部文件,3.4可以实现跳转特定分页.3和4的区别是,3通过 ...

  7. vue04

    目录 Vue项目环境 项目的创建 vue根据配置重新构建依赖 pycharm管理vue项目 vue项目目录结构分析 vue项目生命周期 views文件夹内的.vue文件介绍 配置自定义全局样式 导航栏 ...

  8. linux系统相关文件和操作

    查看内核: uname -r [root@server0 ~]# uname -r -.el7.x86_64 [root@server0 ~]# 查看版本: cat  /etc/redhat-rele ...

  9. .net实现浏览器大文件分片上传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  10. 路由器配置——广播多路访问链路上的OSPF

    一.实验目的:作广播形式的OSPF,了解DR与BDR之间的链路关系 二.拓扑图: 三.具体步骤配置 (1)R1路由器配置 enableconfigure terminalhostname R1inte ...