需求背景
从一个数据库导出一个表的数据,导出文件为CSV文件;需要将数据导入到本地开发环境的数据库里面。CSV文件已经有了,需要解析读CSV文件,并导入进数据库。本文主要研究第一部分,自己写代码解析CSV文件。
Java中可以找到Jar包,工具类,直接使用。也不用自己手工写解析。如果有更成熟的工具,建议直接使用。本文作者写的,只有自己测试过,如果有bug,欢迎留言,不一定及时回。
CSV文件规则
以纯文本形式存储表格数据(数字和文本)。
记录间以换行符分隔;每条记录由字段组成,字段间的分隔符是逗号。
注意:
1、字段中包含有逗号,有换行符,该字段必须用双引号括起来;
2、字段中的双引号用两个双引号表示;
以上提到的逗号和双引号均为半角字符。
如果只是简单的逗号分割,那么就很简单。本文主要研究的就是,有特殊字符作为字段的值,上面注意中的情况出现的情况下,文件的解析。
CSV规则有遗漏的,或者逻辑不完善,能导致歧义的数据案例,评论指出,感谢!
准备测试数据
可以新建一个test.csv文件,用Excel输入值,然后文本打开,观察值。注意包含以下测试案例:
- 正常数据
- 空数据
- 文本有逗号
- 文本有引号
- 文本中有换行
例如:
好的测试数据是开发的前提。习惯先准备,罗列测试数据的所有情况,再开发。开发的时候考虑的更全面。开发也可以分类,从解析简单情况开始。
代码
/**
* 解析CSV字符行集合
* @param lines java 自带的读文件流,按换行符分割的,每行是集合的一个元素
* @return 解析完的结果集合;List<List<String>> resList 所有行是一个集合, 每行的所有字段是一个集合。
*/
public static List<List<String>> spiltCSVString(List<String> lines) {
List<String> oneLine = new ArrayList<String>();
List<List<String>> resList = new ArrayList<>();
if (lines.isEmpty() || lines.size() == 0) {
return resList;
}
String tempStr = "";
char specialChar = '\"';
char splitChar = ',';
boolean specialFlag = false;
for (int i = 0; i < lines.size(); i++) {
String line = lines.get(i);
if (line.indexOf(specialChar) < 0) {
oneLine = new ArrayList<String>();
for (int j = 0; j < line.toCharArray().length; j++) {
if (line.charAt(j) == splitChar) {
oneLine.add(tempStr);
tempStr = "";
continue;
} else {
tempStr += line