java 读取 csv 文件详解
一、opencsv
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.4</version>
</dependency>
1. 读取 csv 文件,手动解析
读取 csv 文件的每一行数据,每行存入一个 string []
/**
* 读取csv文件
*
* @param file csv文件
* @return 数组
*/
public static List<String[]> getCsvDataMethod(MultipartFile file) {
List<String[]> list = new ArrayList<String[]>();
int i = 0;
try {
CSVReader csvReader = new CSVReaderBuilder(
new BufferedReader(
new InputStreamReader(file.getInputStream(), "utf-8"))).build();
Iterator<String[]> iterator = csvReader.iterator();
while (iterator.hasNext()) {
String[] next = iterator.next();
//去除第一行的表头,从第二行开始
if (i >= 1) {
list.add(next);
}
i++;
}
return list;
} catch (Exception e) {
System.out.println("CSV文件读取异常");
return list;
}
}
2. 通过注解映射为 bean
javabean 属性上使用注解 @CsvBindByName 修饰
import com.opencsv.bean.CsvBindByName;
import lombok.Data;
@Data
public class MyBean{
@CsvBindByName(column = "name")
private String name;
@CsvBindByName(column = "title")
private String title;
}
解析 csv 文件
/**
* 解析csv文件并转成bean(方法三)
*
* @param file csv文件
* @param clazz 类
* @param <T> 泛型
* @return 泛型bean集合
*/
public static <T> List<T> getCsvDataMethod3(MultipartFile file, Class<T> clazz) {
InputStreamReader in = null;
CsvToBean<T> csvToBean = null;
try {
in = new InputStreamReader(file.getInputStream(), "utf-8");
HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(clazz);
csvToBean = new CsvToBeanBuilder<T>(in).withMappingStrategy(strategy).build();
} catch (Exception e) {
logger.error("数据转化失败");
return null;
}
return csvToBean.parse();
}
二、 javacsv
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
读取 csv 文件
import com.csvreader.CsvReader;
import java.nio.charset.Charset;
CsvReader csvReader = new CsvReader("CSV文件路径", ',', Charset.forName("utf-8"));
// 获取出当前CSV文件所有的表头信息
String[] headers = csvReader.getHeaders();
// 获取出当前CSV文件所有的表头的数量
int headerCount = csvReader.getHeaderCount();
// 跳过表头(相当于读取完了表头)
csvReader.readHeaders();
// 读取每行的内容
while (csvReader.readRecord()) {
// 获取当前行,第2列的内容
String value1 = csvReader.get(2);
// 获取当前行标题为URL的内容
String value2 = csvReader.get("URL");
// 获取当前行的所有数据(以分隔符分隔的当前行的所有数据)
String rawRecord = csvReader.getRawRecord();
// 获取当前行的所有数据(数组形式)
String[] values = csvReader.getValues();
}
// 读取完成之后,关闭流
csvReader.close();
三、 easycsv
<!--将外部依赖jar包引入项目-->
<dependency>
<!--groupId 随便填写 -->
<groupId>sdk</groupId>
<!--artifactId 随便填写-->
<artifactId>easycsv</artifactId>
<!--version 随便填写-->
<version>4.0.0</version>
<!-- scope=system表示此依赖是来自外部jar,而不是maven仓库。当scope设置为system时,systemPath属性才会生效,systemPath为一个物理文件路径,来指定依赖的jar其物理磁盘的位置。 -->
<scope>system</scope>
<!-- ${project.basedir}代表根目录 -->
<systemPath>${project.basedir}/lib/EasyCSV-1.0-SNAPSHOT.jar</systemPath>
</dependency>
通过 @CsvProperty 注解,将 bean 的属性和 csv 的字段进行映射
// 核心代码
List<OriginalCsvData> dataList = new EasyCsv().readAll(filePath, OriginalCsvData.class);
- 在实际开发过程中,发现如果字段内容中也包含 ",",则不能正确的映射字段值。暂无其他解决思路。目前通过手动解析来解决这个问题。
四、 fastcsv
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>fastcsv</artifactId>
<version>1.0.3</version>
</dependency>
读取 csv 文件
public static void csvReadOperation() throws IOException {
File file = new File("F:\\Excel\\customer-info.csv");
CsvReader csvReader = new CsvReader();
csvReader.setContainsHeader(true);
CsvContainer csv = csvReader.read(file, StandardCharsets.UTF_8);
for (CsvRow row : csv.getRows()) {
System.out.println("First column of line: " + row.getField("用户编号"));
}
}
public static void csvReadOperation1() throws IOException {
File file = new File("F:\\Excel\\customer-info.csv");
CsvReader csvReader = new CsvReader();
CsvContainer csv = csvReader.read(file, StandardCharsets.UTF_8);
for (CsvRow row : csv.getRows()) {
if (row.getOriginalLineNumber() != 1) {
ResultInfo resultInfo = new ResultInfo();
resultInfo.setUserId(row.getField(0));
resultInfo.setUserPhone(row.getField(1));
listResultInfo.add(resultInfo);
}
}
}
public static void csvReadOperation2() throws IOException {
File file = new File("F:\\Excel\\customer-info.csv");
CsvReader csvReader = new CsvReader();
try (CsvParser csvParser = csvReader.parse(file, StandardCharsets.UTF_8)) {
CsvRow row;
while ((row = csvParser.nextRow()) != null) {
System.out.println("Read line: " + row);
System.out.println("First column of line: " + row.getField(0));
}
}
}