使用apache commons-csv读写csv文件
使用apache commons-csv读写csv文件
前言
本文的目的是使用apache commons-csv读写csv文件。
定义实体
Worker是通过ai随机定义的一个java类型:
1 | public class Worker { |
可以通过faker随机生成Worker类型的对象。具体实现可以查看下文。
Apache Commons CSV
Commons CSV 能够读写多种变体的逗号分隔值(CSV)格式文件,由Apache负责开发。
使用maven引入:
1 | <dependency> |
使用groovy gradle引入:
1 | implementation 'org.apache.commons:commons-csv:1.14.0' |
使用kotlin:
1 | implementation("org.apache.commons:commons-csv:1.14.0") |
写csv文件
先创建好文件:
1 | var path = nfsRootPath + File.separator + "workers_" + DateUtils.getYearMonthDay() + ".csv"; |
nfsRootPath为${user.dir}/nfs-root
, DateUtils.getYearMonthDay()表示获取当前年月日(yyyy-MM-dd)。
CSVFormat是apache commons csv
中用于指定CSV文件解析及写入的格式规范。
commons csv
内置了12种格式的支持:
- DEFAULT: 标准逗号分隔值(CSV)格式,遵循RFC4180规范,但允许空行存在
- EXCEL: 微软Excel文件格式(使用逗号作为值分隔符)
- INFORMIX_UNLOAD: Informix 默认 CSV 导出格式(通过 UNLOAD TO file_name 操作生成)
- INFORMIX_UNLOAD_CSV: Informix 默认 CSV 导出格式(通过 UNLOAD TO file_name 操作生成,禁用转义功能)
- MONGODB_CSV: MongoDB 默认 CSV 格式(通过 mongoexport 命令导出使用)
- MONGODB_TSV: MongoDB 默认 TSV 格式(通过 mongoexport 命令导出使用)
- MYSQL:MySQL 默认数据格式(通过 SELECT INTO OUTFILE 和 LOAD DATA INFILE 命令使用)
- ORACLE: Oracle 默认数据格式(通过 SQL*Loader 工具使用)
- POSTGRESQL_CSV: PostgreSQL默认 CSV 格式(通过 COPY 命令操作使用)
- POSTGRESQL_TEXT: PostgreSQL默认文本格式(通过 COPY 命令使用)
- RFC4180: RFC 4180 标准定义的逗号分隔值(CSV)格式
- TDF: 制表符分隔格式(TDF)
这里使用DEFAULT的csv format:
1 | var headers = new String[] { |
利用BufferedWriter和CSVPrinter将Worker对象写入csv文件中:
1 | try (var fw = new FileWriter(path); var bw = new BufferedWriter(fw)) { |
读csv文件
CSVFormat除了可以用于写csv文件之外,还可以用于读csv文件。
先获取文件路径并判断文件是否存在:
1 | var path = nfsRootPath + File.separator + "workers_20250406.csv"; |
CSVFormat提供parse方法读取实现任意实现Reader接口的对象,这里我使用FileReader。
1 | try (var in = new FileReader(path)) { |
部分运行结果如下:
1 | com.github.damingerdai.batcher.pojo.Worker@7b7b1448[id=<null>,employeeNumber=WK4745-87688,version=1,lastName=Schroeder,firstName=Anisha,gender=female,department=DevOps,position=Architect,hireDate=2021-06-30,email=anisha.schroeder@prohaska.net,phoneNumber=18878513958,status=probation] |
Faker
faker移植自Ruby的faker gem(以及Perl的Data::Faker模块),能够生成仿真数据。
针对中国格式的手机号码,可以使用如下代码随机生成:
1 | public class ChinaPhoneNumberGenerator { |
随机生成Worker的代码如下:
1 | public class WorkerMockFactory { |
引用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Damingerdai's Blog!