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,

Java实现csv文件的读写操作

1. 导入依赖

    <dependency>
      <groupId>com.univocity</groupId>
      <artifactId>univocity-parsers</artifactId>
      <version>2.9.1</version>
    </dependency>

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

    /**
     * csv文件导出
     *
     * @param data      导出数据
     * @param file      导出目的文件
     * @param separator 分割符
     * @param clazz     导出对象
     * @param <T>       数据对象泛型
     */
    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);
        }
    }

测试:

    @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);
    }

结果:

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;
	}

测试:

	@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);

	}

结果:

image-20231026181638900

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

  • 涉及到导入导出映射的对象属性上需要加上@Parsed(field = "")注解,其中filed的值设置字段名称与对象属性的映射关系。
  • 分隔符如果是英文逗号分隔可以不用new CsvFormat()进行设置,默认使用的就是英文逗号作为分隔符。
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java 中可以使用开源库 Apache Commons CSV实现 CSV导入导出。以下是一个简单的示例代码,演示如何在 Java 中使用 Apache Commons CSV导入导出 CSV 文件导入 CSV 文件示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; public class CSVReader { public static void main(String[] args) { String csvFile = "data.csv"; try (BufferedReader br = new BufferedReader(new FileReader(csvFile)); CSVParser parser = new CSVParser(br, CSVFormat.DEFAULT)) { for (CSVRecord record : parser) { String id = record.get(0); String name = record.get(1); String age = record.get(2); // 处理 CSV 数据 // ... } } catch (IOException e) { e.printStackTrace(); } } } ``` 导出 CSV 文件示例代码: ```java import java.io.FileWriter; import java.io.IOException; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; public class CSVWriter { public static void main(String[] args) { String csvFile = "data.csv"; try (FileWriter writer = new FileWriter(csvFile); CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT)) { printer.printRecord("1", "John", "Doe"); printer.printRecord("2", "Jane", "Doe"); printer.printRecord("3", "Bob", "Smith"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在实际的应用中,需要根据实际需求进行修改和完善。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值