在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数据。 `javacsv`库由Jonathan Leffler开发,它允许开发者通过简单的API读取和写入CSV文件。在使用`javacsv`之前,你需要将`javacsv.jar`添加到你的项目类路径...
`javacsv`库是处理CSV文件的一种工具,特别是`CsvReader`类,它提供了方便的方法来读取和解析这些文件。 `CsvReader`是`javacsv`库中的核心类,用于读取CSV文件并将其内容转换为Java对象。这个库由`csv`和`java`...
本篇将详细介绍如何在Java中解析CSV文件,并以给定的"Java解析CSV文件"主题为例,结合提供的资源——`lucky_number_format.csv`、`javacsv-2.0.jar`和`CsvUtil.java`进行深入探讨。 首先,我们来看`javacsv-2.0.jar...
javacsv-2.1.jar是这个库的一个特定版本,它包含了一组类和方法,使得Java开发者可以轻松地读取和写入CSV数据。 CSV文件格式的基本原理是,每一行都是一条记录,由字段组成,字段之间用逗号分隔。在Java中,处理CSV...
总结起来,处理千万级别的CSV数据导出,Java开发者需要掌握以下几点: 1. 使用第三方CSV库或Java 8 Stream API进行逐行读写。 2. 分批处理数据,利用多线程并行处理,提高效率。 3. 创建合适的线程池管理并发任务,...
本篇文章将详细讲解如何使用javacsv库来实现这一功能。 首先,`javacsv`是一个轻量级的Java库,专门用于处理CSV文件。它提供了简单易用的API,使我们能够轻松地读取和写入CSV数据。在项目中使用这个库,你需要先将...
这个名为"java csv共用javacsv.jar.zip"的压缩包,包含了一个名为`javacsv.jar`的库文件,可以被Java项目引用以实现CSV文件的相关功能。 `javacsv`库由`csvreader`和`csvwriter`两个主要部分组成。`CsvReader`类...
Java CSV库,如javacsv 2.1,是处理CSV...通过理解和熟练使用它的API,开发者可以在Java项目中轻松地进行CSV数据的读写操作。在实际项目中,结合良好的错误处理和性能优化策略,可以实现高效且可靠的CSV文件处理。
2. 使用`readNext()`方法逐行读取CSV数据。 3. 分割每行数据,根据逗号或其他分隔符提取字段。 4. 同样地,将这些字段映射到Java Bean。 映射数据到Java Bean的过程通常是通过反射完成的。假设我们有一个Java Bean...
5. **内存效率**:在内存有限的环境中,`javacsv` 通过流式处理 CSV 数据,避免一次性加载整个文件到内存,降低了对系统资源的需求。 6. **兼容性**:由于 `javacsv` 是一个 Java 库,因此它可以与任何 Java 兼容的...
"javacsv"库由OpenCSV项目提供,是一个轻量级、高性能的开源Java库,专门设计用来处理CSV数据。它支持多种CSV文件格式,包括那些使用自定义分隔符(如制表符、分号等)或包含复杂结构(如Excel风格的引用)的文件。...
在Java中,处理CSV文件通常需要借助第三方库,如本示例中的`javacsv.jar`。`javacsv`是由Dave Taylor创建的一个小型库,专门用于读写CSV文件。下面我们将详细探讨如何使用Java和`javacsv`库对CSV文件进行读写操作。 ...
它可以更方便地生成和解析CSV数据,支持复杂的CSV格式。 ```java import com.opencsv.CSVWriter; import java.io.FileWriter; import java.io.IOException; public class CSVGeneratorWithOpenCSV { public ...
在Java编程中,CSV(Comma Separated Values)文件是一种常见的数据存储格式,它以逗号分隔每一列的数据,方便数据交换和处理。当处理包含中文字符的CSV文件时,可能会遇到乱码问题,这通常与文件编码设置有关。本篇...
通过引用【opevcsv】依赖,逐行读取数据 并转为Map,Object>格式,后续可以通过BeanUtil.MaptoBean()方法将map转为你需要的bean对象; csv文件必须带表头,bean对象命名符合驼峰格式; 通过此方法可以快速的将文件...
`javacsv.jar`是开源项目,由Dave Newton创建,它提供了一组方便的类和方法,帮助开发者轻松地与CSV数据交互。这个库已经被广泛采用,特别是对于那些需要快速实现CSV功能的项目,但不想依赖大型框架如Apache Commons...
3. **CSVUtils**:在Java中,CSVUtils通常是一个包含各种CSV操作的工具类,如读取、写入、解析和格式化CSV数据。它可能提供了如`writeRecords`方法来批量写入数据记录,`createWriter`用于创建CSV写入器,以及`...
《Java CSV处理库javacsv2.1深度解析》 CSV(Comma Separated Values)是一种常见的数据交换格式,广泛应用于数据分析、报表生成等领域。在Java编程中,处理CSV文件通常需要借助特定的库,而javacsv2.1正是这样一个...
Java中,可以使用OpenCSV或者Apache Commons CSV库来解析CSV文件。解析过程通常包括打开文件、创建解析器、迭代读取每一行,然后将每一行的数据转换为所需的数据结构,如列表或对象实例。 3. 多文件下载与并发处理...
在IT行业中,CSV(Comma Separated Values)文件是一种广泛使用的数据交换格式,因其简单、通用而备受青睐。本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言...