`

[java]csv数据解析

阅读更多
在web前端向后台传送数组时, 经常会遇到一些特殊字符, 如, " ' 之类的, 采用CSV格式可以很好的解决这一问题, 只是在服务器端要解析起来就比较麻烦,

CSV解析:
其实CSV的规则是有点麻烦, 可以归类为CSV模式和非CSV模式,
CSV模式, 为字符串里含有 comma 或 double quotation 这样的字符串, excel导出时会添加"到字符串的开头和结尾, 如果, 字符串里身身含有", 则在"前再加一个", 即""

NON-CSV模式, 就是正常的模式

另外, 2个字符串之间的空格是无效的, 即trim功能(按说应该这样, 但在excel2003里有BUG, 所以要避免这样的情况

算法: 与其用regexp, 还不如用java直接做来得方便, 这可以当年C的经常考的类型来了



package com.ys.util;

public class StringUtil{

	/**
	 * build array(String) with csv format
	 * @param param
	 * @return
	 * @throws Exception CSV Format error
	 */
	public static String[] buildCsvArray(String param) throws Exception{
		List<String> list=new ArrayList<String>();
		int len=param.length();
		char comma=',';
		char quot='"';
		boolean csvMode=false;		//start and end with double quotation

		//abc, ,, "n/a, n/a", "", "abc"
		int i=0;
		while(i<len){
			char key=param.charAt(i);
			if(len>0 && quot==key){
				csvMode=true;
				i++;
			}else{
				csvMode=false;
			}
			if(i<len){
				if(csvMode)
					i=processingCSV(list, param, i);
				else
					i=processingWord(list, param, i);
			}
		}
		//add text if last char is comma, example: "a,b," -> "a", "b", ""
		if(comma==param.charAt(len-1))
			list.add("");
		String[] text=list.toArray(new String[0]);
		return text;
		
	}
	
	/**
	 * process the space between work and work, and return next work start index 
	 * @param param csv string "abc,    def"
	 * @param i the previous word end index, sample: 4
	 * @return  the next work start index, samele: 8 
	 */
	private static int processClose(String param, int i){
		int len=param.length();
		if(i>=len)
			return i;
		char c=param.charAt(i);
		while(' '==c){
			i++;
			c=param.charAt(i);
		}
		return i;
	}
	
	/**
	 * generate word in csv mode, and add into list
	 * @param list 
	 * @param param csv string
	 * @param i work start index
	 * @return end of this work's index
	 */
	private static int processingCSV(List<String> list, String param, int i){
		StringBuffer sb=new StringBuffer("");
		int len=param.length();
		if(i+1>=len){
			list.add(sb.toString());
			return i;
		}
		char c=param.charAt(i);
		char cc=param.charAt(i+1);
		char comma=',';
		char quot='"';
		while(c!=quot || cc!=comma){
			if(c==quot && cc==quot)
				i++;
			sb.append(c);
			c=param.charAt(++i);
			if(i+1>=len)
				break;
			cc=param.charAt(i+1);
		}
		list.add(sb.toString());
		i=processClose(param, i+2);
		return i;
	}
	
	/**
	 * generate word in non-csv mode, and add into list
	 * @param list
	 * @param param string
	 * @param i start of this work's index
	 * @return end of this work's index
	 */
	private static int processingWord(List<String> list, String param, int i){
		StringBuffer sb=new StringBuffer("");
		int len=param.length();
		if(i>=len){
			list.add(sb.toString());
			return i;
		}
		char comma=',';
		for(;i<len;i++){
			char c=param.charAt(i);
			if(c!=comma)
				sb.append(c);
			else
				break;
		}
		list.add(sb.toString());
		i=processClose(param, ++i);
		return i;
	}

}


单元测试

package com.ys.util;

import junit.framework.TestCase;

public class StringUtilTest extends TestCase {

	public void testToStringStringArray() {
		/**
		 *  input these String into excel
		 *  abc
		 *  ab,c
		 *  a"b"c
		 *  a"b,c",d
		 *  abc
		 *  save as csv file
		 */
		String param="abc,\"ab,c\",\"a\"\"b\"\"c\",\"a\"\"b,c\"\",d\",abc";
		String[] result=null;
		try {
			result = StringUtil.buildCsvArray(param);
			for(String text : result){
				System.out.println(text);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		boolean condition=(null!=result)?true:false;
		assertTrue(condition);
	}

}
  • 大小: 66.6 KB
分享到:
评论

相关推荐

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

    这个库提供了一系列方法来帮助我们方便地解析和生成CSV数据。 `javacsv`库由Jonathan Leffler开发,它允许开发者通过简单的API读取和写入CSV文件。在使用`javacsv`之前,你需要将`javacsv.jar`添加到你的项目类路径...

    javacsv_CsvReader:解析CSV文件

    `javacsv`库是处理CSV文件的一种工具,特别是`CsvReader`类,它提供了方便的方法来读取和解析这些文件。 `CsvReader`是`javacsv`库中的核心类,用于读取CSV文件并将其内容转换为Java对象。这个库由`csv`和`java`...

    Java解析CSV文件

    本篇将详细介绍如何在Java中解析CSV文件,并以给定的"Java解析CSV文件"主题为例,结合提供的资源——`lucky_number_format.csv`、`javacsv-2.0.jar`和`CsvUtil.java`进行深入探讨。 首先,我们来看`javacsv-2.0.jar...

    javacsv-2.1.jar

    javacsv-2.1.jar是这个库的一个特定版本,它包含了一组类和方法,使得Java开发者可以轻松地读取和写入CSV数据。 CSV文件格式的基本原理是,每一行都是一条记录,由字段组成,字段之间用逗号分隔。在Java中,处理CSV...

    java csv大数据量导出(千万级别,不会内存溢出)

    总结起来,处理千万级别的CSV数据导出,Java开发者需要掌握以下几点: 1. 使用第三方CSV库或Java 8 Stream API进行逐行读写。 2. 分批处理数据,利用多线程并行处理,提高效率。 3. 创建合适的线程池管理并发任务,...

    java使用javacsv读取csv文件 导入Mysql数据库

    本篇文章将详细讲解如何使用javacsv库来实现这一功能。 首先,`javacsv`是一个轻量级的Java库,专门用于处理CSV文件。它提供了简单易用的API,使我们能够轻松地读取和写入CSV数据。在项目中使用这个库,你需要先将...

    java csv共用javacsv.jar.zip

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

    javacsv2.1实例

    Java CSV库,如javacsv 2.1,是处理CSV...通过理解和熟练使用它的API,开发者可以在Java项目中轻松地进行CSV数据的读写操作。在实际项目中,结合良好的错误处理和性能优化策略,可以实现高效且可靠的CSV文件处理。

    文件上传,java解析excel和csv 转javabean

    2. 使用`readNext()`方法逐行读取CSV数据。 3. 分割每行数据,根据逗号或其他分隔符提取字段。 4. 同样地,将这些字段映射到Java Bean。 映射数据到Java Bean的过程通常是通过反射完成的。假设我们有一个Java Bean...

    javacsv2.2.rar

    5. **内存效率**:在内存有限的环境中,`javacsv` 通过流式处理 CSV 数据,避免一次性加载整个文件到内存,降低了对系统资源的需求。 6. **兼容性**:由于 `javacsv` 是一个 Java 库,因此它可以与任何 Java 兼容的...

    javacsv.zip

    "javacsv"库由OpenCSV项目提供,是一个轻量级、高性能的开源Java库,专门设计用来处理CSV数据。它支持多种CSV文件格式,包括那些使用自定义分隔符(如制表符、分号等)或包含复杂结构(如Excel风格的引用)的文件。...

    java对csv文件进行读写操作

    在Java中,处理CSV文件通常需要借助第三方库,如本示例中的`javacsv.jar`。`javacsv`是由Dave Taylor创建的一个小型库,专门用于读写CSV文件。下面我们将详细探讨如何使用Java和`javacsv`库对CSV文件进行读写操作。 ...

    java CSV 生成与解析

    它可以更方便地生成和解析CSV数据,支持复杂的CSV格式。 ```java import com.opencsv.CSVWriter; import java.io.FileWriter; import java.io.IOException; public class CSVGeneratorWithOpenCSV { public ...

    java 解析csv文件例子,csv文件 中文乱码问题

    在Java编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,它以逗号分隔每一列的数据,方便数据交换和处理。当处理包含中文字符的CSV文件时,可能会遇到乱码问题,这通常与文件编码设置有关。本篇...

    java 读取csv 并转为Map<String,Object>

    通过引用【opevcsv】依赖,逐行读取数据 并转为Map,Object&gt;格式,后续可以通过BeanUtil.MaptoBean()方法将map转为你需要的bean对象; csv文件必须带表头,bean对象命名符合驼峰格式; 通过此方法可以快速的将文件...

    javacsv.jar.zip-jar包

    `javacsv.jar`是开源项目,由Dave Newton创建,它提供了一组方便的类和方法,帮助开发者轻松地与CSV数据交互。这个库已经被广泛采用,特别是对于那些需要快速实现CSV功能的项目,但不想依赖大型框架如Apache Commons...

    Java CSV批量导出工具类

    3. **CSVUtils**:在Java中,CSVUtils通常是一个包含各种CSV操作的工具类,如读取、写入、解析和格式化CSV数据。它可能提供了如`writeRecords`方法来批量写入数据记录,`createWriter`用于创建CSV写入器,以及`...

    javacsv2.1

    《Java CSV处理库javacsv2.1深度解析》 CSV(Comma Separated Values)是一种常见的数据交换格式,广泛应用于数据分析、报表生成等领域。在Java编程中,处理CSV文件通常需要借助特定的库,而javacsv2.1正是这样一个...

    完整实现ftp上传与下载并解析csv文件

    Java中,可以使用OpenCSV或者Apache Commons CSV库来解析CSV文件。解析过程通常包括打开文件、创建解析器、迭代读取每一行,然后将每一行的数据转换为所需的数据结构,如列表或对象实例。 3. 多文件下载与并发处理...

    读取创建CSV文件并自动解析文件编码方式

    在IT行业中,CSV(Comma Separated Values)文件是一种广泛使用的数据交换格式,因其简单、通用而备受青睐。本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言...

Global site tag (gtag.js) - Google Analytics