在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
分享到:
相关推荐
java csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
通过引用【opevcsv】依赖,逐行读取数据 并转为Map,Object>格式,后续可以通过BeanUtil.MaptoBean()方法将map转为你需要的bean对象; csv文件必须带表头,bean对象命名符合驼峰格式; 通过此方法可以快速的将文件...
利用Java swing 对csv和excel文件进行读写;并且可以同时读取5个文件的数量;通过关键字配置来读文件,还有就是通过POI CSVWriter等类的使用来对excel和csv等文件进行操作
通过java解析上传文件,判断文件类型(excel或者csv),将解析后的数据映射到javabean,从而可以进一步操作,入库或者增添数据
文件中包括读取excel、csv文件,同时可以将读取出的文件内容保存在另外一个excel或csv中。注意excel2003和excel2007调用的jar包也不一样,需要将代码进行修改。2007版的将HSSF改成XSSF,2003相反。csv文件用XSSF
基于Java语言的NetCDF文件解析,使用了netcdf4和opencsv两个库,最终将解析后的数据导出为CSV,附依赖文件、源代码及一个测试数据样例。 可结合本人的博客...
主要介绍了Java避免UTF-8的csv文件打开中文出现乱码的方法,结合实例形式分析了java操作csv文件时使用utf-16le编码与utf8编码相关操作技巧,需要的朋友可以参考下
JavaApp_CSVdataToSqlite 使用CSV文件,解析数据并将其插入SQLite内存数据库的Java应用程序。 我们需要一个Java应用程序,该应用程序将使用CSV文件,解析数据并将其插入到SQLite内存数据库中。 一种。 表X有10列A,B...
java 读取和写入csv文件 (自动提取和转换成对象数据)-附件资源
JavaCSV文件是一个自定义CSV文件,用于包含多个数据电子表格。 电子表格在称为数据标题(或更简单的标题)中分组在一起。 每个标头以两行标头元数据开始,并以该标头的数据的最后一个元素结束。 标头中的数据被格式...
您还可以将数据导出为 CSV 文件。 这个库非常容易理解。 它使用默认的 Java SAX 解析器 (org.xml.sax)。 应用程序测试使用 JUnit 4 框架。 安装(针对开发者) 为了使用 BasicOSMParser,您可以下载 ...
该jar包为java实现的解析wis文件的jar包,读入wis文件,可生成csv文件; 支持一维,二维数据的解析,针对wis文件数据单元所占字节不同作了调整
可自动执行数据类型转换(解析和格式化日期、整数、布尔值等)并强制执行约束(必填列、匹配正则表达式等)——如果需要,您可以轻松编写自己的 API。 Super CSV 正在积极维护,如果您遇到困难,开发人员已准备好并...
基于Pyside6开发的数据处理工具兼上位机工具,读取CSV数据作图(自动加载表头),解析日志数据写入Excel,实时数据曲线图,支持描点计算时间,OTA升级,串口通信调试,CMD控制台脚本调试(统计字节)主要用于蓝牙模块...
jakarta-oro.jar commons-net-1.4.1.jar 博文链接:https://firezhfox.iteye.com/blog/1913128
3、解析每一个saz文件,并将解析数据写入创建的同名csv文件中 4、将java工程打包成双击即可执行的bat文件 学习过程中涉及的知识点主要有: 1、Jsoup解析字符串、html文档 2、Java IO类:输入输出流、压缩流(Zip流)...
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
主要介绍了JAVA对CSV格式文本数据处理后再保存成新CSV格式文本的模板,可以学习到java读取csv文件和写csv的方法,需要的朋友可以参考下
内容包含 soapUI使用的具体范例、打包好的jar包,以及Java源代码,源代码标注具体的说明
csv解析器== 简单的 CSV 解析器,它将文件拆分为以逗号分隔的标记。 此处描述的其他规则: : 还包括小型雷达图可视化工具以很好地描绘数据。 基于有限状态机,代表 csv 解析器。