java 读取 csv文件

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));
            }
        }
    }
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值