目录
一、CSV文件简介
1.1.CSV文件介绍
1.2.CSV文件特点
1.3. CSV文件规则
1.4.编者记录
二、CSVParser文件读取
2.1.POM文件----commons-csv作为三方类库
2.2.测试代码
2.3.优缺点
三、将CSV文件转化为Excel的xlsx文件
3.1.POM文件
3.2.测试代码
3.3.运行结果
3.4.优缺点
四、CsvReader文件读取
4.1.POM文件
4.2.测试代码一
4.2.1.测试代码
4.2.2.运行截图
4.3.测试代码二
4.3.1.测试代码
4.3.2.运行截图
4.4.优缺点
五、CsvReader文件读取
5.1.POM文件
5.2.测试代码
5.3.运行截图
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一。
CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是bitASCII是最基本的通用编码。
“CSV”并不是一种单一的、定义明确的格式(尽管RFC 4180有一个被通常使用的定义)。因此在实践中,术语“CSV”泛指具有以下特征的任何文件:
1、纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312;
2、由记录组成(典型的是每行一条记录);
3、每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
4、每条记录都有同样的字段序列。
1、开头是不留空,以行为单位。
2、可含或不含列名,含列名则居文件第一行。
3、一行数据不跨行,无空行。
4、以半角逗号(即,)作分隔符,列为空也要表达其存在。
5、列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。
6、文件读写时引号,逗号操作规则互逆。
7、内码格式不限,可为 ASCII、Unicode 或者其他。
8、不支持数字
9、不支持特殊字符
以上信息来自百度百科。由上述信息可知,CSV文件是以表格形式存在的文本文件,不能用读取表格的方法读取CSV文件。同时文件整体框架确定,但具体形式不固定,所以本文仅记录CSV文件的读取,不做详细数据处理。
org.apache.commons
commons-csv
1.9.0
package com.task.test;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/**
* @ClassName: Test5
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/8 0008 11:17
*/
public class Test5 {
public static void main(String[] args) throws IOException {
// 读取CSV文件
FileReader file= new FileReader("文件绝对路径");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT);
ArrayList list = new ArrayList<>();
String str = null;
// 遍历CSV文件的每一行并获取单元格数据
for (CSVRecord record : parser) {
for (int i = 0; i < record.size(); i++) {
if (i < record.size()-1) {
if (null != record.get(i)) {
str = str + record.get(i) + "|";
}else {
str = str + "|";
}
}
}
System.out.println(str);
}
// 关闭流
parser.close();
isr.close();
fis.close();
file.close();
}
}
优点:代码简单,不需要手动分割数据;
spire.xls.free
spire-xls-free
5.1.0
package com.task.test;
import com.spire.xls.*;
import java.util.EnumSet;
/**
* @ClassName: Test4
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/7 0007 17:31
*/
public class Test4 {
public static void main(String[] args) {
//思路:将原文件用表格打开,并保存为新表格
System.out.println("文件转化开始!");
//加载CSV文件
Workbook workbook = new Workbook();
//原截图存在中文乱码,现已优化
//Excel版本与下文保持一致即可,具体版本看自己选择
workbook.loadFromFile("C:\\Users\\cuipa\\Desktop\\Jfile\\20230731-3.csv", ",", 1, 1,ExcelVersion.Version2013, Charset.forName("GBK"));
//获取第一个工作表
Worksheet sheet = workbook.getWorksheets().get(0);
//访问工作表中使用的范围
CellRange usedRange = sheet.getAllocatedRange();
//当将范围内的数字保存为文本时,忽略错误
usedRange.setIgnoreErrorOptions(EnumSet.of(IgnoreErrorType.NumberAsText));
//自适应行高、列宽
usedRange.autoFitColumns();
usedRange.autoFitRows();
//保存文档
workbook.saveToFile("C:\\Users\\cuipa\\Desktop\\Jfile\\CSVtoExcel.xlsx", ExcelVersion.Version2013);
System.out.println("文件转换结束!");
}
}
test4优化后截图
优点:代码简单,可自定义数据分隔符
缺点:只能转化为xlsx文件,且转化后还需要代码读取xlsx文件
net.sourceforge.javacsv
javacsv
2.0
package com.task.test;
import com.csvreader.CsvReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: Test2
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/7 0007 15:50
*/
public class Test2 {
public static void main(String[] args) {
String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
List list = Test2.readCsvByCsvReader(fileName);
for (String[] str :list) {
for (String num : str) {
System.out.print(num + "|");
}
}
//打印二
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.get(i).length; j++) {
System.out.println(list.get(i)[j]);
}
}
}
public static List readCsvByCsvReader(String filePath) {
List arrList = new ArrayList();
try {
CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
while (reader.readRecord()) {
arrList.add(reader.getValues()); // 按行读取,并把每一行的数据添加到list集合
}
reader.close();
System.out.println("读取的行数:" + arrList.size());
} catch (Exception e) {
e.printStackTrace();
}
return arrList;
}
}
package com.task.test;
import com.csvreader.CsvReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @ClassName: Test2
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/7 0007 15:50
*/
public class Test2 {
String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
List> list2 = Test2.readCsvByCsvReader2(fileName);
for (int i = 0; i < list2.size(); i++) {
for (int j = 0; j < list2.get(i).size(); j++) {
if (list2.get(i).get(j) != null) {
System.out.println(list2.get(i).get(j));
}
}
}
}
public static List> readCsvByCsvReader2(String filePath) {
List> arrList = new ArrayList>();
try {
CsvReader reader = new CsvReader(filePath, ',', Charset.forName("GBK"));
while (reader.readRecord()) {
arrList.add(Arrays.asList(reader.getValues())); // 按行读取,并把每一行的数据添加到list集合
}
reader.close();
System.out.println("读取的行数:" + arrList.size());
} catch (Exception e) {
e.printStackTrace();
}
return arrList;
}
}
优点:代码简单,可自行调节文本分隔符和读取文件的编码
缺点:不知道,以后再说
注:两个测试类没区别,就是返回值的数据类型不一样
net.sourceforge.javacsv
javacsv
2.0
package com.task.test;
import com.csvreader.CsvReader;
import java.io.*;
import java.text.ParseException;
/**
* @ClassName: Test1
* @Author: BlueBlue
* @Description:
* @Date: 2023/3/7 0007 11:34
*/
public class Test1 {
public static void main(String[] args) throws IOException, ParseException {
String fileName = "C:\\Users\\Administrator\\Desktop\\Jfile\\CSV\\20230327.csv";
DataInputStream inFile = new DataInputStream(new FileInputStream(fileName));
BufferedReader reader = new BufferedReader(new InputStreamReader(inFile, "GBK"));//这里如果csv文件编码格式是GBK,改成GBK即可
CsvReader creader = new CsvReader(reader, ',');
String[] TxtInfo = null;
for (int j = 0; creader.readRecord(); j++) {
TxtInfo = creader.getRawRecord().split(",");
System.out.println(creader.getRawRecord());
// System.out.println("TxtInfo[1]:"+TxtInfo[1]);
}
creader.close();
reader.close();
inFile.close();
}
}