Java实现Csv文件导入导出
什么是.csv文件?
CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv
作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 ,
分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。
为什么使用CSV?
- 简单易懂:CSV 文件基于纯文本格式,因此可以使用任何文本编辑器(如Notepad++)轻松打开和编辑。
- 数据兼容性:CSV 文件中的数据可以很容易地跨平台进行传输和处理,任何具有 CSV 处理功能的软件(如Microsoft Excel、Google Sheets、甚至编程语言库)都能处理该类型的文件。
- 资源占用低:CSV 文件以纯文本形式存储数据,其体积相对较小,便于节省存储空间。
CSV文件的结构
- 每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。第一行是字段名。
- 间隔符分隔:每行数据中,使用间隔符进行数据分隔,默认一般使用
,
,也可以使用空格等其他字符,代表不同的数据。经过测试,好像只有逗号分隔的csv文件才能在Excel中正常解析。 - 引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号
'
或双引号"
)将这个数据包围起来,防止误认为是两个不同数据。
例如:
姓名,年龄,性别
张三,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);// 写入headerwriter.writeHeaders(settings.getHeaders());data.forEach(writer::processRecord);writer.close();} catch (Exception e) {log.error("export .csv file failed. message.", e);}}
测试:
@Getter@Setter@NoArgsConstructor@AllArgsConstructor@ToStringpublic static class User implements Serializable {@Parsedprivate String name;@Parsedprivate 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文件:
文本编辑器中打开:
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@ToStringpublic static class User implements Serializable {@Parsedprivate String name;@Parsedprivate 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);}
结果:
总结:.csv文件导入导出比较简单,需要注意的地方有:
- 涉及到导入导出映射的对象属性上需要加上
@Parsed
注解。 - 分隔符如果是英文逗号分隔可以不用
new CsvFormat()
进行设置,默认使用的就是英文逗号作为分隔符。