• Java实现Csv文件导入导出


    Java实现Csv文件导入导出

    什么是.csv文件?

    CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。

    为什么使用CSV?

    1. 简单易懂:CSV 文件基于纯文本格式,因此可以使用任何文本编辑器(如Notepad++)轻松打开和编辑。
    2. 数据兼容性:CSV 文件中的数据可以很容易地跨平台进行传输和处理,任何具有 CSV 处理功能的软件(如Microsoft Excel、Google Sheets、甚至编程语言库)都能处理该类型的文件。
    3. 资源占用低:CSV 文件以纯文本形式存储数据,其体积相对较小,便于节省存储空间。

    CSV文件的结构

    1. 每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。第一行是字段名。
    2. 间隔符分隔:每行数据中,使用间隔符进行数据分隔,默认一般使用 , ,也可以使用空格等其他字符,代表不同的数据。经过测试,好像只有逗号分隔的csv文件才能在Excel中正常解析。
    3. 引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号 ' 或双引号 ")将这个数据包围起来,防止误认为是两个不同数据。

    例如:

    姓名,年龄,性别
    张三,25,男
    李四,28,男
    王五,22,
    • 1
    • 2
    • 3
    • 4

    Java实现csv文件的读写操作

    1. 导入依赖

        <dependency>
          <groupId>com.univocitygroupId>
          <artifactId>univocity-parsersartifactId>
          <version>2.9.1version>
        dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 导出。拿来主义,可以直接创建一个工具类使用,把导入导出方法粘贴进去使用即可。

        /**
         * csv文件导出
         *
         * @param data      导出数据
         * @param file      导出目的文件
         * @param separator 分割符
         * @param clazz     导出对象
         * @param        数据对象泛型
         */
        public static <T> void export(Collection<T> data, File file, String separator, Class<T> clazz) {
            try {
                CsvWriterSettings settings = new CsvWriterSettings();
                //设置分隔符
                CsvFormat csvFormat = new CsvFormat();
                csvFormat.setDelimiter(separator);
                settings.setFormat(csvFormat);
                settings.setHeaderWritingEnabled(false);
                settings.setRowWriterProcessor(new BeanWriterProcessor<>(clazz));
                CsvWriter writer = new CsvWriter(Files.newOutputStream(file.toPath()), "utf-8", settings);
                // 写入header
                writer.writeHeaders(settings.getHeaders());
                data.forEach(writer::processRecord);
                writer.close();
            } catch (Exception e) {
                log.error("export .csv file failed. message.", e);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    测试:

        @Getter
        @Setter
        @NoArgsConstructor
        @AllArgsConstructor
    	@ToString
        public static class User implements Serializable {
            @Parsed(filed = "name")
            private String name;
            @Parsed(filed = "age")
            private Integer age;
        }
    
        public static void main(String[] args) {
            User user1 = new User("张三", 18);
            User user2 = new User("李四", 19);
            List<User> users = Arrays.asList(user1, user2);
            File file = new File("E:\\test.csv");
            CsvUtil.export(users, file, ",", User.class);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果:

    Excel支持打开.csv文件:

    image-20231026180302656

    文本编辑器中打开:

    image-20231026183411302

    3. 导入

     	/**
    	 * 读取crv文件并转换成List
    	 *
    	 * @param separator crv文件分隔符
    	 * @param file      待读取文件
    	 * @return crv对象list
    	 */
    	public static <T> List<T> read(String separator, File file, Class<T> clazz) {
    		List<T> result = Collections.emptyList();
    		try {
    			BeanListProcessor<T> rowProcessor = new BeanListProcessor<>(clazz);
    			//设置分隔符
    			CsvFormat csvFormat = new CsvFormat();
    			csvFormat.setDelimiter(separator);
    
    			CsvParserSettings parserSettings = new CsvParserSettings();
    			parserSettings.setProcessor(rowProcessor);
    			parserSettings.setFormat(csvFormat);
    
    			CsvParser parser = new CsvParser(parserSettings);
    			InputStream in = Files.newInputStream(file.toPath());
    			parser.parse(in);
    			//逐行读取
    			result = rowProcessor.getBeans();
    		} catch (Exception e) {
                log.error("Import csv file failed. message: ", e);
    		}
    		return result;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    测试:

    	@Getter
    	@Setter
    	@NoArgsConstructor
    	@AllArgsConstructor
    	@ToString
    	public static class User implements Serializable {
    		@Parsed(filed = "name")
            private String name;
            @Parsed(filed = "age")
            private Integer age;
        }
    
    	public static void main(String[] args) {
    
    		File file = new File("E:\\test.csv");
    		List<User> users = CsvUtil.read(",", file, User.class);
    		users.forEach(System.out::println);
    
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结果:

    image-20231026181638900

    总结:.csv文件导入导出比较简单,需要注意的地方有:

    • 涉及到导入导出映射的对象属性上需要加上@Parsed(field = "")注解,其中filed的值设置字段名称与对象属性的映射关系。
    • 分隔符如果是英文逗号分隔可以不用new CsvFormat()进行设置,默认使用的就是英文逗号作为分隔符。
  • 相关阅读:
    保研复习-计算机组成原理
    Kafka与Spark案例实践
    Android 中如何使用 App Links
    Vue组件化 ==>局部组件定义及全局组件定义
    中小企业如何降低网络攻击和数据泄露的风险?
    ELK 企业级日志分析系统
    基于51单片机十字路口交通信号灯(启动按键+绿灯同亮报警)
    OSG学习之三:坐标变换
    使用Vue.js编写页面组件的简单步骤
    栅栏涂色题
  • 原文地址:https://blog.csdn.net/pig_boss/article/details/134062249