OpenCSV处理反斜线 \ ,将.csv文件映射为Java对象落库clickhouse

一、关键:RFC4180Parser

1、默认情况下,CSVReader使用双反斜线(’\’)作为其转义字符。同时,CSVWriter使用双引号(’“’)作为转义字符。
因此,反斜线字符会导致不正确的转义。在读数据时,CSVParser将忽略单个反斜线字符,因为它是转义字符。  
CSVReader使用CSVParser解析CSV数据。

2、OpenCSV还提供了一个严格遵循RFC4180标准的解析器:RFC4180Parser。
使用 RFC4180Parser 解析器,CSVReader会以双引号(’“’)作为转义字符,这样就可以与CSVWriter的转义方式保持一致。

二、原始需求

使用定时任务,将用户的行为日志数据文件(.csv)解析为java对象,并批量落入clickhouse数据库(MySQL亦同理)。
行为日志包含:网站访问日志、文件上传日志等数据

三、具体方案:本文着重介绍第3点

  • 1、springboot+mybatis配置clickhouse(略) 点击前往

  • 2、spring的定时任务@Scheduled

 /**
     * 1、每天00:05,将当天的用户行为日志文件解压至指定文件夹
     */
    @Scheduled(cron = "0 5 0 * * ?")
    public void unZipFile() {
   
        /** 1、解压当天拉取的前一天行为日志文件到指定文件夹下 **/
        log.info("时间:"+DateUtils.getCurrentDateStr()+",开始解压文件 filePath:" + filePath + ",unZipPath:" + unZipPath);
        fileUnzipService.unZip(filePath + DateUtils.getYestoday(DateUtils.YYMMDD), unZipPath + DateUtils.getYestoday(DateUtils.YY_MM_DD) + "/");
    }

    /**
     * 2、每天00:30,将前一天解压后的用户行为日志文件数据同步至clickhouse
     * 具体为clickhouse库的 xxx 表
     * 3、入库完成后,删除前一天(昨天)同步目录下的行为日志文件,并且删除前两天(前天)解压目录下的日志文件,减少对服务器存储资源的占用
     */
    @Scheduled(cron = "0 30 0 * * ?")
    public void syncUserLogFromFileToCK() {
   
      //1、解析.csv文件映射为java对象;
      //2、批量入库clickhouse,并记录每天不同日志类型入库的数据条数,方便后续查看
    }
    

- 3、openCSV解析.csv映射为java对象

四、实施步骤:

.csv文件数据demo(基于文件数据创建clickhouse对应的表以及映射的java对象)
OpenCSV处理反斜线 \ ,将.csv文件映射为Java对象落库clickhouse_第1张图片

  • 1、openCSV jar包引入
 <dependency>
      <groupId>com.opencsvgroupId>
      <artifactId>opencsvartifactId>
     <version>4.6version>
dependency>
  • 2、serviceImpl代码(依次对应3种不同类型日志)
/**
 - @author: Lucy
 - @version:
 - @createTime: 2021/5/19 10:51
 - @Description: 使用opencsv解析csv文件(基于字段名的映射)并进行ORM映射为对象集合 需
 - 注意CSV文件中列的内容包含转义字符 "\"的问题
 - 指定转换类型的注解主要有@CsvCustomBindByName和@CsvCustomBindByPosition这2种,分别对应基于字段名的映射和基于字段位置的映射。
 */
@Service
@Slf4j
public class CsvParseLogServiceImpl implements CsvParseLogService {
   
   

你可能感兴趣的:(Java,CSV,java,csv)