Java 利用opencsv 读写csv

本文结构:

  • 废话
  • 动手读csv
  • 写csv

工作中需要读写csv,由于csv 文件较大,数据比较多,所以需要选择一个速度快的csv 读取插件。经过比较选择opencsv 。官方解释:Opencsv是一个易于使用的CSV(逗号分隔值)解析器库。之所以开发它,是因为当时所有CSV解析器都没有商业友好的许可证。Java 7是目前支持的最小版本。

Opencsv支持您可能想要做的所有基本CSV类型的事情:

  • 每行的任意数量的值。

  • 忽略引用元素中的逗号。

  • 处理带有嵌入式回车的带引号的条目(即跨越多行的条目)。

  • 可配置的分隔符和引号字符(或使用合理的默认值)。

    所有这些事情都可以通过可塑性方法的表现来完成阅读和写作:

  • 往返于一个字符串数组。

  • 来自带注释的bean。

  • 来自数据库一次读取所有条目,或使用Iterator风格的模型

废话不多说:官方文档[http://opencsv.sourceforge.net/]

跟我一起做 读csv

引入依赖

<dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>4.2</version>
        </dependency>

读取csv 映射为对象(此时会按照csv 的顺序进行映射全量,如果需要只取csv中的部分列则看下一部分)

 public  static <T> List<T> getCsvData(Class<T> clazz) {
        InputStreamReader in=null;
        try {
            in = new InputStreamReader(new FileInputStream("xxxx.csv"), "gbk");
        } catch (Exception e) {

        }

        System.out.println(System.currentTimeMillis());
        HeaderColumnNameMappingStrategy<T> strategy = new HeaderColumnNameMappingStrategy<>();
        strategy.setType(clazz);

        CsvToBean<T> csvToBean = new CsvToBeanBuilder<T>(in)
                .withSeparator(',')
                .withQuoteChar('\'')
                .withMappingStrategy(strategy).build();
        List<T> list= csvToBean.parse();
        System.out.println(System.currentTimeMillis());
        System.out.println(list.size());
    return list;    
        }

如果只需要取csv 中部分列的值映射到对象里,则只需要在对象中添加注解 @CsvBindByName即可

(required = true ) 参数指csv 中该列的值不能为空

public class Student {
    @CsvBindByName(column = "name", required = true)
    private String name;
    @CsvBindByName(column = "address", required = false)
    private String address;
    @CsvBindByName(column = "age", required = false)
    private Integer age;
    //不需要从csv中取值
		private Integer sex;

当然这样的取值还是不够自由,那么Opencsv还提供了更自由的方式

读取csv 的任意行和列。而且csv很大的话,速度也很快哦,只要内存跟得上。

minLine 为读取的起始行,当然你也可以再设置一个结束行的字段,每次判断行号。当然也需要自己设置一个行号,每次自增。

 private static Set<String> readCsv(int minLine,  String path) throws IOException {
        Integer lineNum = minLine;
        FileReader fReader = new FileReader(new File(path));
        CSVReader csvReader = new CSVReader(fReader);
        String[] values;
        Set<String> set = new HashSet<>();
        //跳过前方minLine 条数据
        csvReader.skip(minLine);
        while ((values = csvReader.readNext()) != null) {
                // values 是一个数组,存储了csv当前行的所有元素,在此你可以将数组中的元素取出来放入你的对象中
                set.add(StringUtils.join(values, Constants.CSV_SPLIT));
            lineNum++;
        }
        return set;
    }

写csv

	public static void main(String[] args) throws Exception {
		File file = new File("xxx.csv");
		Writer writer = new FileWriter(file);
    //分隔符默认为逗号
		CSVWriter csvWriter = new CSVWriter(writer);
		String[] strs = {"abc" , "abc" , "abc"};
		csvWriter.writeNext(strs);
		csvWriter.close();
	}

好了,打完收工。

发布了343 篇原创文章 · 获赞 649 · 访问量 231万+

猜你喜欢

转载自blog.csdn.net/u012373815/article/details/98220021