zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    输入一个1-9的数i,再输入一个数字n,表示 i 出现的次数,输入的2个数字 i 和 n 组合成如下表达式:如i=2,n=4,2+22+222+2222=?,计算结果是多少?
    现有数列1/2;2/3;3/5;5/8······第十次出现的是什么?
    猜数游戏:范围时1-100,若错误就提示大了还是小了,猜对则结束,允许猜10次,游戏结束后对玩家评价:1次猜对;5次内猜对;10次内猜对;没有猜对
    登录模拟,用户名和密码输入错误后给出相关错误提示,并告知还有多少次错误机会,如果5次验证失败将冻结账户
    30人围坐轮流表演节目,按顺序数1-3,每次数到3的人就表演节目,表演过的人不再参加报数,那么在仅剩一个人没有表演的时候,共报数多少人次?
    docker 自定义镜像
    php 镜像richarvey/nginx-php-fpm的ngnix配置
    php tp5常用小知识
    php Tp5下mysql的增删改查
    php 面试常问问题
  • 原文地址:https://www.cnblogs.com/heyang78/p/3470609.html
Copyright © 2011-2022 走看看