csv文件生成与解析


        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-csv</artifactId>
            <version>1.9.0</version>
        </dependency>

1. csv文件生成


    // 接口地址
    @Value("${jk.device.uri}")
    private String requestURI;

    // 生成文件存放路径
    @Value("${jk.file.path}")
    private String filePath;


    @Scheduled(cron ="0 0 1 * * ?") // 每天凌晨1点执行
    public void requestDeviceData() {
//        System.out.println("定时任务执行了");

        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        //获取前一天日期
        LocalDate date = LocalDate.now().minusDays(1);
        String dateStr = date.format(fmt);

        String requestURL = requestURI + "?mdmTime=" + dateStr;

        RestTemplate restTemplate = new RestTemplate();

        JSONObject jsonObject =
                restTemplate.getForObject(requestURL, JSONObject.class);

        //判断有没有数据
        if (jsonObject == null || jsonObject.isEmpty()) {
            return;
        }
        JSONArray data = jsonObject.getJSONArray("data");

        if (data == null || data.isEmpty()) {
            return;
        }

        List<JkOfflineDevice> list = data.toJavaList(JkOfflineDevice.class);
        if (list == null || list.isEmpty()) {
            return;
        }

        String fileName = "mdmData_" + dateStr + ".csv";

        //生成文件
        generateFile(list, filePath + fileName);
   

    }



    /**
     * 生成csv文件
     */
    public void  generateFile(List<JkOfflineDevice> list, String fileName)   {

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName ));
             CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT)) {

            // 写入表头
            csvPrinter.printRecord(
                    "id",
                    "phoneno",
                    "sfzh",
                    "imei",
                    "imsi",
                    "manufacturer",
                    "product",
                    "statusDevice",
                    "createTime",
                    "mdmTime",
                    "area",
                    "statusPhone" );

            // 写入数据行
            for (JkOfflineDevice jd : list) {
                csvPrinter.printRecord(
                        jd.getId(),
                        jd.getPhoneno(),
                        jd.getSfzh(),
                        jd.getImei(),
                        jd.getImsi(),
                        jd.getManufacturer(),
                        jd.getProduct(),
                        jd.getStatusDevice(),
                        jd.getCreateTime(),
                        jd.getMdmTime(),
                        jd.getArea(),
                        jd.getStatusPhone()
                );
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2. 解析csv文件


    @Value("${jk.ftp.path}")
    private String filePath;

    private static final String [] headerName = {"id","phoneno","sfzh","imei","imsi","manufacturer","product","statusDevice","createTime","mdmTime","area","statusPhone"};


    public void parseFile() {

//        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//        //获取前一天日期
//        LocalDate date = LocalDate.now().minusDays(1);
//        String dateStr = date.format(fmt);
//
//        String fname = filePath + "mdmData_" +  dateStr + ".csv";
//
//        File file = new File(fname);
//
//        String fileName = file.getName();
//        long  time = file.lastModified();
//        System.out.println("文件名:" + fileName + "  时间:" + time);


        //   表记录最后更新时间, 按照这个时间读取之后的文件
        // 遍历每一个文件,比较时间,大于数据库记录时间的就解析保存,小于的掠过

        Integer recordId = 1;
//        Long  recordTime = recordMapper.getLastTimeById(recordId);
        Long  recordTime = 1L;

        // 如果数据库记录时间不存在(说明本次操作是第一次解析同步),就使用一个比较早的时间数据
        if (recordTime == null ){
            recordTime = 123456789L;
        }

        // 遍历目录下所有文件
        File directory = new File(filePath);
        if (!directory.exists() || !directory.isDirectory()) {
            directory.mkdirs();
        }

        File[] fileList = directory.listFiles();
        if (fileList == null){
            return;
        }
        for (File file : fileList){
            String fileName = file.getName();
            long  time = file.lastModified();

            // 不是csv文件,或者不是 mdmData_ 目标文件
            if (!fileName.contains(".csv") || !fileName.contains("mdmData_")){
                continue;
            }


            if (time <= recordTime){
                continue;
            }

            List<JkOfflineDevice> list = parseCSV(file);

            if (list == null || list.isEmpty()){
                continue;
            }

            System.out.println("文件名:" + fileName + "  time:" + time + "时间:"+ LocalDateTime.now());

            System.out.println("解析完成:" + list.size());
            System.out.println(list.get(0).toString());

        }

    }


    /**
     * 把指定格式的CVS文件解析成JkOfflineDevice对象集合
     * @param file
     * @return
     */
    private List<JkOfflineDevice> parseCSV(File file){

        List<JkOfflineDevice> list = null;

        if (file == null || !file.exists()){
            return list;
        }

        try (CSVParser parser = CSVParser.parse(
                new FileReader(file),
                CSVFormat.DEFAULT.withFirstRecordAsHeader())) {

            //表头格式校验
            // id,phoneno,sfzh,imei,imsi,manufacturer,product,statusDevice,createTime,mdmTime,area,statusPhone
            List<String> headerList = parser.getHeaderNames();
            boolean isValid = new HashSet<>(headerList).containsAll(Arrays.asList(headerName));

            //表头不是预期格式,说明该文件不是目标文件,跳过
            if (!isValid) {
                //System.out.println("文件格式错误,跳过");
                return list;
            }

           // System.out.println("文件格式正确!!");

            list = new ArrayList<>();

            for (CSVRecord record : parser) {

                JkOfflineDevice jd = new JkOfflineDevice();

                jd.setId(record.get("id"));
                jd.setPhoneno(record.get("phoneno"));
                jd.setSfzh(record.get("sfzh"));
                jd.setImei(record.get("imei"));
                jd.setImsi(record.get("imsi"));
                jd.setManufacturer(record.get("manufacturer"));
                jd.setProduct(record.get("product"));
                jd.setStatusDevice(Integer.valueOf(record.get("statusDevice")));
                jd.setCreateTime(record.get("createTime"));
                jd.setMdmTime(record.get("mdmTime"));
                jd.setArea(record.get("area"));
                jd.setStatusPhone(record.get("statusPhone"));

                list.add(jd);
            }
        } catch (IOException e) {
            list = null;
            e.printStackTrace();
        }

        return list;
    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单片机是一种小型的计算机芯片,通常不具备完整的文件系统功能。然而,我们可以使用单片机来生成和存储简单的.csv文件。 首先,我们需要选择适合单片机的储存器件,例如SD卡或者EEPROM。这些储存器件可以作为外部存储介质,用于保存数据。 接下来,我们需要确定.csv文件的结构。.csv文件是一种以逗号分隔的文本文件,其中每行表示一个数据记录,每个记录的字段之间用逗号分隔。我们需要按照.csv文件的结构,将需要保存的数据进行格式化,然后按照逗号分隔的方式写入储存器件。 在写入数据之前,我们需要首先初始化储存器件。这可以通过单片机的相应接口和功能库来实现。初始化过程可能包括格式化储存器件、创建.csv文件的头部信息等。 接下来,我们需要编写单片机的程序,将需要保存的数据格式化,并按照逗号分隔的方式写入储存器件。这可以通过单片机的编程语言和相应的功能库来实现。 写入数据完成后,我们还可以提供相应的读取功能,通过单片机从储存器件中读取.csv文件的内容。这可以通过解析文本文件的方式来实现,将每行数据按照逗号分隔的方式进行解析,并将解析后的数据发送到单片机的其他模块或者外部设备进行进一步处理。 总结来说,单片机可以通过外部储存器件来生成和保存.csv文件。这需要首先选择适合的储存器件,然后按照.csv文件的结构将数据格式化写入,最后通过解析文本文件的方式读取.csv文件的内容。这样,单片机就可以实现简单的文件系统功能,生成和处理.csv文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值