eimhee 发表于 2013-1-27 05:00:51

CSV文件的生成与分析

写好这些类之后,就可以开始着手测试了。
写一个测试CSV文件生成的jsp文件。如:

<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException" %>
create a csv file
<%
      try {
            CSVCreater csvCre = new CSVCreater("C:\\test.csv");
            csvCre.setConvertFlag(true);
            csvCre.setData("aaa");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,a");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.writeLine();
            csvCre.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
%>

写一个测试CSV文件分析的jsp文件。如:

<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException,
java.util.ArrayList" %>
analysis a csv file<br>
<%
      try {
            CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv");
            csvAna.setConvertFlag(true);
            ArrayList al = csvAna.analysis();
            for (int i = 0; i < al.size(); i++) {
      out.println( (i + 1) + " line start<br>");
                ArrayList al1 = (ArrayList) al.get(i);
                for (int j = 0; j < al1.size(); j++) {
                  out.println(al1.get(j));
            out.println("<br>");
                }
      out.println( (i + 1) + " line end<br>");
            }
            csvAna.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
%>

将编译后的class拷贝到TOMCAT自己的应用的WEB-INF下。将jsp文件放到自己的应用下。
然后启动TOMCAT,访问jsp文件,当访问creCSV.jsp的时候,正常情况下可以看到C盘根目录下生成了一个test.csv文件。然后访问anaCSV.jsp文件,可以看到分析后的数据被打印出来。

至此,csv生成,分析类做成。

使用帮助:

CSVCreater.java类,用来生成CSV文件的类。
构造函数public CSVCreater(String arg) throws IOException
参数:arg 要生成的csv文件的绝对路径
使用例CSVCreater csvCre = new CSVCreater("C:\\test.csv");

public void setConvertFlag(boolean b)
是否转义设定函数(将半角双引号进行转义处理)
参数:true 需要转义(推荐)false 不转义

public void setData(String data)
添加单个数据的函数

public void writeLine()
结束换行函数

public void writeDataByLine(String[] args)
将一个数组的元素添加到一行并换行函数

public void close() throws IOException
必须调用的函数,写入文件并关闭文件处理的对象。

例子可参考jsp文件中的代码,但是jsp文件中的close()方法是在try块中执行的,不推荐,使用的时候还是在finally块中执行要安全一些。
这个类涉及到了文件的操作,有可能出现IOException,出现异常的时候会抛出给使用者。

CSVAnalysis.java
构造函数 public CSVAnalysis(String f) throws IOException
参数是要分析的文件的绝对路径。

public ArrayList analysis() throws IOException
分析流处理的方法,返回ArrayList对象。返回的ArrayList的数据格式是
ArrayList中存放着ArrayList对象,存放的每个ArrayList对象对应csv文件的一行。
一行对应的ArrayList中存放着String对象,为该行中所有的数据。

public void close() throws IOException
必须调用的函数,关闭文件处理的对象。
同样,这个方法应在finally块中执行要安全一些。

源码下载:CSVproc.zip
源码为上面提到过的所有的类和jsp文件


anaCSV.jsp
<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException,java.util.ArrayList" %>
analysis a csv file<br>
<%

      try {
            CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv");
            csvAna.setConvertFlag(true);
            ArrayList al = csvAna.analysis();
            for (int i = 0; i < al.size(); i++) {
out.println( (i + 1) + " line start<br>");
                ArrayList al1 = (ArrayList) al.get(i);
                for (int j = 0; j < al1.size(); j++) {
                  out.println(al1.get(j));
    out.println("<br>");
                }
out.println( (i + 1) + " line end<br>");
            }
            csvAna.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
%>




creCSV.jsp

<%@ page contentType="text/html" import="com.vogoal.util.*,com.vogoal.util.csv.*,java.io.IOException" %>
create a csv file
<%

      try {
            CSVCreater csvCre = new CSVCreater("C:\\test.csv");
            csvCre.setConvertFlag(true);
            csvCre.setData("aaa");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,a");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.writeLine();
            csvCre.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
%>



package com.vogoal.util;

/**
* @author SinNeR
* http://bbs.blueidea.com
*
* static method
*/
public class UtilCla {
    public static String CSVEncode(String in) {
      String out = "";
      if (in == null)
            return out;
      out = in.replaceAll("&", "&");
      out = out.replaceAll("\"", """);
      return out;
    }

    public static String CSVDecode(String in) {
      String out = "";
      if (in == null)
            return out;
      out = in.replaceAll(""", "\"");
      out = out.replaceAll("&", "&");
      return out;
    }
}





package com.vogoal.util.csv;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import com.vogoal.util.UtilCla;

/**
* @author SinNeR
* http://bbs.blueidea.com
*
* CSVAnalysis
*/
public class CSVAnalysis {
    private InputStreamReader fr = null;

    private boolean convertFlag = false;

    private ArrayList dataContainer = new ArrayList();

    public static final String DEL_CHAR = ",";

    public static final String AV_CHAR = "\"";

    public CSVAnalysis(String f) throws IOException {
      fr = new InputStreamReader(new FileInputStream(f));
    }

    public void setConvertFlag(boolean b) {
      convertFlag = b;
    }

    public ArrayList analysis() throws IOException {

      BufferedReader br = new BufferedReader(fr);
      String rec = null;
      try {
            while ((rec = br.readLine()) != null) {
                ArrayList alLine = analysisLine(rec);
                dataContainer.add(alLine);
            }
      } catch (IOException e) {
            throw e;
      } finally {
            br.close();
      }

      return dataContainer;
    }

    private ArrayList analysisLine(String strLine) {
      System.out.println(strLine);
      ArrayList al = new ArrayList();
      String[] dataArr = strLine.split(AV_CHAR);
      for (int i = 1; i < dataArr.length; i = i + 2) {
            if (convertFlag)
                al.add(UtilCla.CSVDecode(dataArr));
            else
                al.add(dataArr);
      }
      return al;
    }

    public void close() throws IOException {
      fr.close();
    }

    public static void main(String[] args) {
      try {
            CSVAnalysis csvAna = new CSVAnalysis("C:\\test.csv");
            csvAna.setConvertFlag(true);
            ArrayList al = csvAna.analysis();
            for (int i = 0; i < al.size(); i++) {
                ArrayList al1 = (ArrayList) al.get(i);
                for (int j = 0; j < al1.size(); j++) {
                  System.out.println(al1.get(j));
                }
            }
            csvAna.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
    }
}





package com.vogoal.util.csv;

import java.io.FileOutputStream;
import java.io.IOException;

import com.vogoal.util.UtilCla;

/**
* @author SinNeR
* http://bbs.blueidea.com
*
* CSVCreater
*/
public class CSVCreater {
    private FileOutputStream fos = null;

    private StringBuffer sb = null;

    private boolean convertFlag = false;

    public static final String DEL_CHAR = ",";

    public static final String AV_CHAR = "\"";

    public CSVCreater(String arg) throws IOException {
      fos = new FileOutputStream(arg, false);
      sb = new StringBuffer();
    }

    public void setData(String data) {
      if (convertFlag)
            data = UtilCla.CSVEncode(data);
      sb.append(AV_CHAR);
      sb.append(data);
      sb.append(AV_CHAR);
      sb.append(DEL_CHAR);
    }

    public void setConvertFlag(boolean b) {
      convertFlag = b;
    }

    public void writeLine() {
      if (sb.charAt(sb.length() - 1) == ',')
            sb.delete(sb.length() - 1, sb.length());
      sb.append("\r\n");
    }

    public void writeDataByLine(String[] args) {
      for (int i = 0; i < args.length; i++)
            setData(args);
      writeLine();
    }

    public void close() throws IOException {
      try {
            fos.write(sb.toString().getBytes());
      } catch (IOException e) {
            throw e;
      } finally {
            fos.close();
      }
    }

    public static void main(String[] args) {
      try {
            CSVCreater csvCre = new CSVCreater("C:\\test.csv");
            csvCre.setConvertFlag(true);
            csvCre.setData("aaa");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,a");
            csvCre.setData("aa,a");
            csvCre.writeLine();
            csvCre.setData("aa\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.setData("aa,\"a");
            csvCre.writeLine();
            csvCre.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
    }
}




package com.vogoal.test;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* @author SinNeR
*
* analysis a CSV file
*/
public class HelloCSVAnalysis {
    public static void main(String[] args) {
      InputStreamReader fr = null;
      BufferedReader br = null;
      try {
            fr = new InputStreamReader(new FileInputStream(
                  "C:\\helloCsv.csv"));
            br = new BufferedReader(fr);

            String rec = null;
            String[] argsArr = null;
            while ((rec = br.readLine()) != null) {
                System.out.println(rec);
                argsArr = rec.split(",");
                for (int i = 0; i < argsArr.length; i++) {
                  System.out.println("num " + (i + 1) + ":" + argsArr);
                }
            }
      } catch (IOException e) {
            e.printStackTrace();
      }finally{
            try{
            if ( fr != null )
                fr.close();
            if ( br != null )
                br.close();
            }catch(IOException ex){
                ex.printStackTrace();
            }
      }
    }
}



package com.vogoal.test;

import java.io.FileWriter;
import java.io.IOException;

/**
* @author SinNeR
*
* create a CSV file
*/
public class HelloCsvCreater {
    public static void main(String[] args) {
      try {
            FileWriter fw = new FileWriter("C:\\helloCsv.csv");
            fw.write("aaa,bbb,ccc,ddd,eee,fff,ggg,hhh\r\n");
            fw.write("aa1,bb1,cc1,dd1,ee1,ff1,gg1,hh1\r\n");
            fw.write("aaa\r\n");
            fw.write("aa2,bb2,cc2,dd2,ee2,ff2,gg2,hh2\r\n");
            fw.close();
      } catch (IOException e) {
            e.printStackTrace();
      }
    }
}
页: [1]
查看完整版本: CSV文件的生成与分析