用正则表达式和java解析csv文件
用正则表达式和java解析csv文件
csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔。windows默认用excel打开。它的格式包括以下几点(它的格式最好就看excel是如何解析的。):
①每条记录占一行;
②以逗号为分隔符;
③逗号前后的空格会被忽略;
④字段中包含有逗号,该字段必须用双引号括起来;
⑤字段中包含有换行符,该字段必须用双引号括起来;
⑥字段前后包含有空格,该字段必须用双引号括起来;
⑦字段中的双引号用两个双引号表示;
⑧字段中如果有双引号,该字段必须用双引号括起来;
⑨第一条记录,可以是字段名;
⑩以上提到的逗号和双引号均为半角字符。
下面通过正则表达式和java解析csv文件。
首先给出匹配csv文件的一个最小单位数据的正则表达式(如:1,2,3是csv文件的一行数据,则1,是该csv文件的一个最小单位数据):
"(([^",/n ]*[,/n ])*([^",/n ]*"{2})*)*[^",/n ]*"[ ]*,[ ]*|[^",/n]*[ ]*,[ ]*|"(([^",/n ]*[,/n ])*([^",/n ]*"{2})*)*[^",/n ]*"[ ]*|[^",/n]*[ ]*
下面是解析文件的java代码:
package myutil;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author panhf2003
* @version 2008/09/05,
*/
public class CsvFileUtil {
/**
* 构造,禁止实例化
*/
private CsvFileUtil() {
}
public static void main(String[] args) {
// test
try {
readCsvFile("e://test1.csv");
} catch (FileNotFoundException ex) {
Logger.getLogger(CsvFileUtil.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(CsvFileUtil.class.getName()).log(Level.SEVERE, null, ex);
}
}
/**
* csv文件读取<BR/>
* 读取绝对路径为argPath的csv文件数据,并以List返回。
*
* @param argPath csv文件绝对路径
* @return csv文件数据(List<String[]>)
* @throws FileNotFoundException
* @throws IOException
*/
public static List readCsvFile(String argPath) throws FileNotFoundException, IOException {
CsvFileUtil util = new CsvFileUtil();
File cvsFile = new File(argPath);
List list = new ArrayList();
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader(cvsFile);
bufferedReader = new BufferedReader(fileReader);
String regExp = util.getRegExp();
// test
System.out.println(regExp);
String strLine = "";
String str = "";
while ((strLine = bufferedReader.readLine()) != null) {
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(strLine);
List listTemp = new ArrayList();
while(matcher.find()) {
str = matcher.group();
str = str.trim();
if (str.endsWith(",")){
str = str.substring(0, str.length()-1);
str = str.trim();
}
if (str.startsWith("/"") && str.endsWith("/"")) {
str = str.substring(1, str.length()-1);
if (util.isExisted("/"/"", str)) {
str = str.replaceAll("/"/"", "/"");
}
}
if (!"".equals(str)) {
//test
System.out.print(str+" ");
listTemp.add(str);
}
}
//test
System.out.println();
list.add((String[]) listTemp.toArray(new String[listTemp.size()]));
}
} catch (FileNotFoundException e) {
throw e;
} catch (IOException e) {
throw e;
} finally {
try {
if (bufferedReader != null) {
bufferedReader.close();
}
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
throw e;
}
}
return list;
}
/**
* csv文件做成<BR/>
* 将argList写入argPath路径下的argFileName文件里。
*
* @param argList 要写入csv文件的数据(List<String[]>)
* @param argPath csv文件路径
* @param argFileName csv文件名
* @param isNewFile 是否覆盖原有文件
* @throws IOException
* @throws Exception
*/
public static void writeCsvFile(List argList, String argPath, String argFileName, boolean isNewFile)
throws IOException, Exception {
CsvFileUtil util = new CsvFileUtil();
// 数据check
if (argList == null || argList.size() == 0) {
throw new Exception("没有数据");
}
for (int i = 0; i < argList.size(); i++) {
if (!(argList.get(i) instanceof String[])) {
throw new Exception("数据格式不对");
}
}
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
String strFullFileName = argPath;
if (strFullFileName.lastIndexOf("//") == (strFullFileName.length() - 1)) {
strFullFileName += argFileName;
} else {
strFullFileName += "//" + argFileName;
}
File file = new File(strFullFileName);
// 文件路径check
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
try {
if (isNewFile) {
// 覆盖原有文件
fileWriter = new FileWriter(file);
} else {
// 在原有文件上追加数据
fileWriter = new FileWriter(file, true);
}
bufferedWriter = new BufferedWriter(fileWriter);
for (int i = 0; i < argList.size(); i++) {
String[] strTemp = (String[]) argList.get(i);
for (int j = 0; j < strTemp.length; j++) {
if (util.isExisted("/"",strTemp[j])) {
strTemp[j] = strTemp[j].replaceAll("/"", "/"/"");
bufferedWriter.write("/""+strTemp[j]+"/"");
} else if (util.isExisted(",",strTemp[j])
|| util.isExisted("/n",strTemp[j])
|| util.isExisted(" ",strTemp[j])
|| util.isExisted("��",strTemp[j])){
bufferedWriter.write("/""+strTemp[j]+"/"");
} else {
bufferedWriter.write(strTemp[j]);
}
if (j < strTemp.length - 1) {
bufferedWriter.write(",");
}
}
bufferedWriter.newLine();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close();
}
if (fileWriter != null) {
fileWriter.close();
}
} catch (IOException e) {
throw e;
}
}
}
/**
* @param argChar
* @param argStr
* @return
*/
private boolean isExisted(String argChar, String argStr) {
boolean blnReturnValue = false;
if ((argStr.indexOf(argChar) >= 0)
&& (argStr.indexOf(argChar) <= argStr.length())) {
blnReturnValue = true;
}
return blnReturnValue;
}
/**
* 正则表达式。
* @return 匹配csv文件里最小单位的正则表达式。
*/
private String getRegExp() {
String strRegExp = "";
strRegExp =
"/"(("+ SPECIAL_CHAR_A + "*[,//n ])*("+ SPECIAL_CHAR_A + "*/"{2})*)*"+ SPECIAL_CHAR_A + "*/"[ ]*,[ ]*"
+"|"+ SPECIAL_CHAR_B + "*[ ]*,[ ]*"
+ "|/"(("+ SPECIAL_CHAR_A + "*[,//n ])*("+ SPECIAL_CHAR_A + "*/"{2})*)*"+ SPECIAL_CHAR_A + "*/"[ ]*"
+ "|"+ SPECIAL_CHAR_B + "*[ ]*";
return strRegExp;
}
private static final String SPECIAL_CHAR_A = "[^/",//n ]";
private static final String SPECIAL_CHAR_B = "[^/",//n]";
}
用正则表达式和java解析csv文件相关推荐
- java 解析 csv 文件
文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码 import java.io.BufferedReader; import java.io.FileInpu ...
- Java 解析CSV文件 CSV解析
需求背景 从一个数据库导出一个表的数据,导出文件为CSV文件:需要将数据导入到本地开发环境的数据库里面.CSV文件已经有了,需要解析读CSV文件,并导入进数据库.本文主要研究第一部分,自己写代码解析C ...
- java解析csv文件写入mysql_java读取cvs文件并导入数据库
本文实例为大家分享了java读取cvs文件并导入数据库的具体代码,供大家参考,具体内容如下 首先获取文件夹下面的所有类型相同的excel,可以用模糊匹配contains("匹配字段" ...
- java解析csv文件工具类,java操作CSV文件工具类
离线路灯 UID:3 注册时间2011-08-21 最后登录2021-03-15 在线时间5398小时 发帖659 精华44 金币3650 威望1881 股份280 发帖659 金币3650威望188 ...
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解...
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- JAVA通过Hutool解析CSV文件【导入即用,无需封装】
JAVA通过Hutool解析CSV文件 Java解析CSV方式有很多种方式[javaCSV(未更新),openCSV(apache)],这篇文章主要是用到Hutool工具类,能快速的解析读取,不需 ...
- csv java 解析_Java解析csv文件
使用opencsv解析csv文件并进行ORM映射为对象集合,可以指定分隔符,主要有以下几种映射方式. 接口 策略 MappingStrategy 顶级接口 HeaderColumnNameMappin ...
- android 将SQLite数据库的表格导出为csv格式,并解析csv文件
在做android的开发的时候,将数据保存到SQLite数据库中,有时候会要将保存的这些数据导出成excel表格,这样更方便查看.通过查找资料,可以将数据库中的表格转化成 csv(Comma-Sepa ...
- java读取csv文件_使用扫描仪读取Java中的CSV文件
java读取csv文件 We can use Java Scanner Class to read CSV File in java. 我们可以使用Java扫描程序类在Java中读取CSV文件. 读取 ...
最新文章
- mysql 万亿数据_sql-server – 哪个数据库可以处理数十亿/数万亿条记录的存储?...
- Delphi如果要追赶C#,最应该做的
- 求旋转数组中的最小值
- wordpressQQ登陆php代码_WordPress实现前台登录功能
- html设置了标签但是定义不了,在HTML标签管理器中设置不带元素ID的HTML中的事件...
- apply、call、callee、caller初步了解
- 二叉树C++ | 深度优先遍历(前序、中序、后序)_3
- python123测试_【测码学院】python自动化测试学习-自动化测试模型
- 获取客户端IP和MAC
- BGP增强特性(华为设备)
- python一共多少模块,python常见模块有哪些
- CDA 数据分析师 Level1 基本知识(4)--统计学原理
- OneNote for win10 登录不了
- [转载]厚积博发,有的放矢
- 幂函数衰减系数公式推导(最小二乘法求解一元线性回归方程系数)
- 安装office相关组件出现错误1310
- 休闲娱乐 - 减肥餐
- 使用D触发器完成带有异步清零clrn和同步使能wen的8位寄存器
- 传记-《硅谷钢铁侠》书中的精髓:从埃隆·马斯克的精神世界和人格特质里,找寻成功的秘密。
- Console.read()、Console.readline()、Console.readkey()和Console.Write、Console.Writeline()的意思
热门文章
- f2 柱状图滚动 钉钉小程序_钉钉小程序图表库AntV - F2 使用总结
- pythonrgbd图片像素对齐_利用pyrealsense获取深度图,并进行像素对齐
- android接收不能广播,【11-16求助】急急急,service中无法接收广播!
- java贪吃蛇教程_用Java做的贪吃蛇,简单版......
- 各种抠图动态图片_学习抠取动物毛发图片的PS抠图技巧
- 64位微型计算机系统是指内存,重庆2012年计算机非等级考试一级笔试试题
- java override 访问权限_java 重写(Override)的规则
- 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)
- nginx重点优化合集一
- 《可穿戴创意设计:技术与时尚的融合》一一导读