`
ericFang
  • 浏览: 101533 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

csv java

    博客分类:
  • J2SE
阅读更多
COMMA SEPARATED VALUE的缩写,出现在档案总管中的档案类型是「逗号分格」,依计算机原来的设定,如果直接点选该档案,计算机将以EXCEL的模式开启该档案。但建议您千万不要这么做,因为CSV档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号方式储存,而造成档案中的 CRC值发生错误。这也是笔者初出茅庐时所得到的惨痛经验,但如果想一窥CSV档的真实面貌,笔者建议您使用WORDPAD或是记事本(NOTE)来开启,再则先另存新档后用EXCEL开启,也是方法之一。
开启后的CSV档包含了四或五个字段(部分),由左至右分别记载着:文件名称(XXXX.JPG)、档案大小(以BYTE为单位)、CRC32值(八个英文字母或数字组成)、
档案路径(档案储存的子目录名称)和档案内容描述(一般来说都是明星的英文姓名甚或是专辑名称,也可能空白)。而其中第四栏「档案路径」因为每个人储存整理图档的方式不同,所以本栏通常不存在,而一般有含有「档案路径」这栏的CSV档,又称为ECSV档案 CSV文件,也叫逗号分隔值文件,英文名称COMMA SEPARATED VALUE

具体文件格式

每条记录占一行
以逗号为分隔符
逗号前后的空格会被忽略
字段中包含有逗号,该字段必须用双引号括起来
字段中包含有换行符,该字段必须用双引号括起来
字段前后包含有空格,该字段必须用双引号括起来
字段中的双引号用两个双引号表示
字段中如果有双引号,该字段必须用双引号括起来
第一条记录,可以是字段名



我们经常将Excel格式的文件保存为csv格式以方便上传和修改,可是当数据中包含逗号和双引号的时候Excel会把该字段用双引号括住并把数据中的"改为"",从而给解析带来了困难。我写了以下函数来解析这样的字符串:

testSplitCSV.java:

import java.util.Vector;
class  testSplitCSV{
/**
* Split one line of csv file
* @return a String array results
*/
public static String[] splitCSV(String src) throws Exception{
  if (src==null || src.equals("")) return new String[0];
  StringBuffer st=new StringBuffer();
  Vector result=new Vector();
  boolean beginWithQuote = false;
  for (int i=0;i<src.length();i++){
   char ch = src.charAt(i);
   if (ch=='\"'){
    if (beginWithQuote){
     i++;
     if (i>=src.length()){
      result.addElement(st.toString());
      st=new StringBuffer();
      beginWithQuote=false;
     }else{
      ch=src.charAt(i);
      if (ch == '\"'){
       st.append(ch);
      }else if (ch == ','){
       result.addElement(st.toString());
       st=new StringBuffer();
       beginWithQuote = false;
      }else{
       throw new Exception("Single double-quote char mustn't exist in filed "+(result.size()+1)+" while it is begined with quote\nchar at:"+i);
      }
     }
    }else if (st.length()==0){
     beginWithQuote = true;
    }else{
     throw new Exception("Quote cannot exist in a filed which doesn't begin with quote!\nfield:"+(result.size()+1));
    }
   }else if (ch==','){
    if (beginWithQuote){
     st.append(ch);
    }else{
     result.addElement(st.toString());
     st=new StringBuffer();
     beginWithQuote = false;
    }
   }else{
    st.append(ch);
   }
  }
  if (st.length()!=0){
   if (beginWithQuote){
    throw new Exception("last field is begin with but not end with double quote");
   }else{
    result.addElement(st.toString());
   }
  }
  String rs[] = new String[result.size()];
  for (int i=0;i<rs.length;i++){
   rs[i]=(String)result.elementAt(i);
  }
return rs;
}

public static void main(String[] args){
  String src1=  "\"fh,zg\",sdf,\"asfs,\",\",dsdf\",\"aadf\"\"\",\"\"\"hdfg\",\"fgh\"\"dgnh\",hgfg'dfh,\"asdfa\"\"\"\"\",\"\"\"\"\"fgjhg\",\"gfhg\"\"\"\"hb\"";
  try {
   String[] Ret = splitCSV(src1);
   for (int i=0;i<Ret.length;i++){
    System.out.println(i+": "+Ret[i]);
   }
  }
  catch(Exception e) {
   e.printStackTrace();
  }
}
}


/**
* 在很多时候我们都需要将一些数据集合以某种文件格式输出,其中CSV文件输出是一种比较常用的方式.
* 下面是一个简单的实现CSV文件输出的代码,与大家共享.
*/
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForward;
import org.apache.struts.actions.DispatchAction;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;


public class CsvUtil extends DispatchAction {

public ActionForward exportCsv(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {

   HttpSession session = request.getSession();
   //头部
   String data = "姓名,电子邮件地址,移动电话,业务电话,业务传真,职务,部门\n";
   //具体的数据,可以动态的从数据库中读取
   data += "张三,zhangs@163.com,13800000000,010-88889999,010-99998888,部门领导,产品研发部\n";
   data += "李四,lis@163.com,13800000001,010-88889999,010-99998888,业务助理,产品研发部\n";
   StringBuilder str = new StringBuilder();
   str.append(data);
   response.setContentType("text/csv");
   response.setCharacterEncoding("gb18030");
   response
     .setHeader("Content-Disposition",
       "attachment; filename=\""
         + new String("通讯薄.csv".getBytes("gb18030"),
           "iso8859-1") + "\"");
   PrintWriter out = response.getWriter();
   out.write(str.toString());
   out.flush();
   out.close();
   return null;
}

}




import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy;
import au.com.bytecode.opencsv.bean.CsvToBean;

public class CsvDemo {
   
    public static void main(String[] args) throws IOException {
       
        final String[] header = new String[]{"name", "sex", "age"};
        final String[][] data = new String[][]{header, {"Lucy", "F", "22"}, {"Tom", "M", "25"}, {"Lily", "F", "19"}};

         File tempFile = File.createTempFile("csvWriterTest", ".csv");
         tempFile.deleteOnExit();

         CSVWriter writer = new CSVWriter(new FileWriter(tempFile));
        for (int i = 0; i < data.length; i++) {
             writer.writeNext(data[i]);
         }
         writer.close();

         CSVReader reader = new CSVReader(new FileReader(tempFile));
         String[] line;
         String readline = "";
        for (int row = 0; (line = reader.readNext()) != null; row++) {
            for (int col = 0; col < line.length; col++) {
                if (data[row][col] != null) {
                     System.out.print(line[col] + (col != line.length - 1 ? "," : ""));
                     readline = readline + line[col] + (col != line.length - 1 ? "," : " ");
                 }
             }
             System.out.println("");
         }
       
         ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
         strat.setType(Person.class);
         String[] columns = new String[] {"name", "sex", "age"};
         strat.setColumnMapping(columns);
         CsvToBean csv = new CsvToBean();
         List<?> persons = csv.parse(strat, new StringReader(readline));
        for (int i = 1; i < persons.size(); i++) {
             System.out.println(((Person)persons.get(i)).getName());
             System.out.println(((Person)persons.get(i)).getSex());
             System.out.println(((Person)persons.get(i)).getAge());
         }
       
         reader.close();
     }
}
分享到:
评论
1 楼 ardacool 2010-12-10  
房主真伟大, 大家多给力,谢谢共享

相关推荐

    csv.rar_csv_csv java_csv java_java vcf csv_java操作v

    本篇文章将深入探讨如何在Java环境中处理这两种格式,特别是如何使用Java来解析VCF文件,并将数据转换为CSV格式。 CSV是一种简单但实用的数据交换格式,它以逗号分隔每个字段,每一行代表一条记录。在Java中处理CSV...

    java操作csv文件(读、写)

    在做项目的时候,发现使用POI无法解析以csv文件结尾的文件,虽然csv文件能用Excel打开,但是csv文件没有像Excel一样有规定的电子表格形式,故使用POI无法解析csv文件,在网上找了一下,发现java有提供java csv文件来...

    java实现excel转csv

    在Java编程环境中,将Excel文件(.xls或.xlsx格式)转换为CSV文件是一项常见的任务,特别是在数据处理和分析中。本文将深入探讨如何利用Java来完成这个过程,主要使用Apache POI库,这是一个广泛使用的开源库,专门...

    java读取csvjava 按顺序创建文件

    在Java编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,通常用于数据交换。CSV文件的每一行代表一个记录,记录之间通过换行符分隔,每个字段则由逗号或其他分隔符分隔。在本文中,我们将深入...

    write-read-csv-files-in-java-example-code.zip_read csv java

    在Java编程语言中,处理CSV(逗号分隔值)文件是一项常见的任务,尤其是在数据导入导出、数据分析或数据存储的场景中。本教程将详细讲解如何在Java中读取和写入CSV文件,通过一个实际的例子代码进行演示。首先,我们...

    java 导入Excel 文件,支持xls、xlsx、csv格式

    以下将详细讲解如何在Java中处理`xls`、`xlsx`和`csv`格式的文件。 首先,对于`xls`文件,这是Excel 2003及更早版本使用的文件格式,基于HSSF(Horrible Spreadsheet Format)库。Apache POI项目提供了一个强大的...

    java 读取csv文件

    在Java编程中,读取CSV(Comma Separated Values)文件是一项常见的任务,尤其是在处理数据导入、数据分析或数据存储时。CSV文件因其简洁、通用的格式而被广泛使用。本篇将详细介绍如何在Java中有效地读取CSV文件,...

    java 读取写入csv

    ### Java读取与写入CSV文件的详细解析 在日常的软件开发中,处理CSV(Comma Separated Values)文件是一种常见的需求,特别是在数据分析、数据导入导出等场景下。Java作为一种广泛使用的编程语言,提供了多种方式来...

    javacsv_CsvReader:解析CSV文件

    在Java编程环境中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,用于存储表格数据,如电子表格或数据库。CSV文件以纯文本形式存储,每一行代表一个记录,记录间的字段通过逗号分隔。`javacsv`库是...

    csv解析 javacsv2.1解析csv文件的方法

    在Java中,处理CSV文件通常需要借助第三方库,如本案例中的`javacsv`库,版本2.1。这个库提供了一系列方法来帮助我们方便地解析和生成CSV数据。 `javacsv`库由Jonathan Leffler开发,它允许开发者通过简单的API读取...

    csv java pathcsv java pathcsv java pathcsv java path

    Java作为一种强大的编程语言,提供了多种处理CSV文件的方法。在本篇文章中,我们将深入探讨如何在Java中读取、写入以及操作CSV文件,并结合“Path”类来管理文件路径。 首先,让我们理解CSV文件的基本结构。CSV文件...

    java读取csv例子

    Java读取CSV例子 Java读取CSV例子是通过使用javacsv-2.0.jar包来实现的。javacsv-2.0.jar包提供了CsvReader和CsvWriter两个类,分别用于读取和写入CSV文件。在本例子中,我们将展示如何使用javacsv-2.0.jar包来...

    java操作CSV文件

    ### Java操作CSV文件知识点 #### 一、简介与背景 在日常的数据处理工作中,CSV(Comma-Separated Values)文件是一种常见的数据交换格式。它简单易用且跨平台兼容性好,常被用于导入导出数据、数据分析等场景。在...

    java实现批量excel转csv

    java实现批量excel转csv,其中csv文件为utf-8格式,支持直接导入数据库。

    java csv共用javacsv.jar.zip

    这个名为"java csv共用javacsv.jar.zip"的压缩包,包含了一个名为`javacsv.jar`的库文件,可以被Java项目引用以实现CSV文件的相关功能。 `javacsv`库由`csvreader`和`csvwriter`两个主要部分组成。`CsvReader`类...

    java 大数据导出csv小工具

    标题中的“java 大数据导出csv小工具”指的是一个基于Java编程语言开发的应用程序,其主要功能是将大量数据转换并导出为CSV(逗号分隔值)格式的文件。CSV是一种通用的文件格式,广泛用于数据交换,因为它可以被...

    java实现csv导出千万级数据实例

    本实例聚焦于“java实现csv导出千万级数据实例”,旨在提供一个高效、稳定的解决方案,避免因数据量过大而导致的性能问题,如Java中的栈溢出(Stack Overflow)。CSV(Comma Separated Values)格式因其简单、通用性...

    用JAVA将数据库导入csv程序

    在Java中,处理CSV文件主要依赖于第三方库,如OpenCSV、Apache Commons CSV或Java 8及以上版本内置的`java.util.CSVPrinter`。在这个程序中,我们可能使用了其中一个库来创建和写入CSV文件。 接下来,我们来探讨...

Global site tag (gtag.js) - Google Analytics