记录解析.csv大文件

由于文件太大只能打开部分内容,我们只需要知道一行数据格式即可

下面采用读取的方式为行读取,避免OOM

@Test
public void testReadCsv() throws Exception{
    String path="D:\\workspace\\数据平台导入\\20200929\\temperture.csv";
    List<TempertureData> lists = new LinkedList<>();
    try (
         FileInputStream inputStream = new FileInputStream(path);
         InputStreamReader isr= new InputStreamReader(inputStream,"GBK");
         Scanner sc = new Scanner(isr)) {
        /**
         * 读取csv文件
         * 因为文件过大,所以需要用scanner每行读取
         * 用FileInputStream 相当于在内存和文件之见加了一个数据传输管道
         * 然后用Scanner去读取这个流,一行一行的去读这个文件
         */
        while (sc.hasNextLine()) {
            String line = sc.nextLine();
            //文件是CSV文件,CSV文件中的每一列是用","隔开的,这样就可以得到每一列的元素
            //由于该文件读取的数据携带上引号,这里吧双引号去掉
            String s = line.replaceAll("\"", "");
            String[] str = s.split(",");
            //解析数据
            TempertureData tempertureData = new TempertureData();
            tempertureData.setTempertureId(Long.valueOf(str[0]));
            tempertureData.setYear(str[1]);
            tempertureData.setMonth(str[2]);
            tempertureData.setDay(str[3]);
            tempertureData.setTime(str[4]);
            tempertureData.setMonthDay(dataAnalys(str[2],str[3]));
            tempertureData.setAveTem(str[5]);
            tempertureData.setDayMaxTem(str[6]);
            tempertureData.setDayMinTem(str[7]);
            tempertureData.setQualityAveTem(str[8]);
            tempertureData.setQualityDayMaxTem(str[9]);
            tempertureData.setQuailtyDayMinTem(str[10]);
            tempertureData.setStationId(str[11]);
            lists.add(tempertureData);
            if (lists.size()%40000==0){
                //每解析4W条数据就执行批量插入
                AnalysisList(lists);
                lists.clear();
            }
        }

        log.info("剩余数据也insert"+lists.size());
        //将剩余数据也插入,防止数据丢失
        AnalysisList(lists);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
//使用jdbc批量执行大数据量
public static void AnalysisList( List<TempertureData> lists){
        log.info("执行插入操作开始:===============list长度为"+lists.size());
        //1.注册驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://***:3306/dataplatform?useUnicode=true&characterEncoding=utf-8&useSSL=no&rewriteBatchedStatements=true",
                    "root", "***");
            String sql="insert into temperture_data (temperture_id,year,month,day,time,month_day,ave_tem,day_max_tem,day_min_tem,quality_ave_tem,quality_day_max_tem,quailty_day_min_tem,station_id) " +
                    "values(?,?,?,?,?,?,?,?,?,?,?,?,?)";
            //3.获得预处理对象
            PreparedStatement pstmt = con.prepareStatement(sql);
            for (TempertureData tempertureData :lists){
                pstmt.setLong(1, tempertureData.getTempertureId());
                pstmt.setString(2, tempertureData.getYear());
                pstmt.setString(3, tempertureData.getMonth());
                pstmt.setString(4, tempertureData.getDay());
                pstmt.setString(5, tempertureData.getTime());
                pstmt.setString(6, tempertureData.getMonthDay());
                pstmt.setString(7, tempertureData.getAveTem());
                pstmt.setString(8, tempertureData.getDayMaxTem());
                pstmt.setString(9, tempertureData.getDayMinTem());
                pstmt.setString(10, tempertureData.getQualityAveTem());
                pstmt.setString(11, tempertureData.getQualityDayMaxTem());
                pstmt.setString(12, tempertureData.getQuailtyDayMinTem());
                pstmt.setString(13, tempertureData.getStationId());
                pstmt.addBatch();
            }
            int [] counts = pstmt.executeBatch();
            log.info("执行条数:"+counts.length);
            //6.释放资源
            pstmt.close();
            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

解析完毕一共11568000条数据

单片机是一种小型的计算机芯片,通常不具备完整的文件系统功能。然而,我们可以使用单片机来生成和存储简单的.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、付费专栏及课程。

余额充值