掌握这些技巧,让Excel批量数据清洗变得简单高效!

2023年 10月 2日 41.9k 0

什么是数据清洗

数据清洗是指在数据处理过程中对原始数据进行筛选、转换和修正,以确保数据的准确性、一致性和完整性的过程。它是数据预处理的一部分,旨在处理和纠正可能存在的错误、缺失值、异常值和不一致性等数据质量问题。

为什么要数据清洗

Excel在数据采集场景中非常常用。作为一款电子表格软件,它提供了丰富的功能和易用的界面,使其成为大部分人首选的数据采集工具之一。

而在数据采集的过程中,因为采集渠道多样,数据格式也多种多样,从而会出现部分数据的丢失和不准确的情况,因此为了处理掉这些 “垃圾”数据,需要对数据进行清洗。

哪些数据需要进行清洗

通常在这几种情况下需要进行数据清洗。

1.缺失数据处理:数据在采集或迁移的过程中,出现数据的遗漏。

2.错误数据判断:数据在采集或迁移的过程中与原数据不一致。

3.重复数据处理:一条数据重复出现多次。

4.数据格式转换:数据在采集或迁移的过程中出现了乱码。

数据清洗都需要做些什么

下面让我们看一下数据清洗都会涉及的处理步骤:

  • 分析需求:通过对数据原本的格式,特征进行分析,规划数据清洗的业务规则及需求。
  • 打开文件:把Excel文件打开,通常这一步需要依赖Excel组件库,比如使用POI,GcExcel,EasyExcel等。
  • 读取数据:通过Excel库中的API,读取需要操作的数据,这里比较一下三个产品的特点:
  • GcExcel提供了**IRange(区域)**的概念,可以通过API快速的读取有数据的区域。POI和EasyExcel(POJO注解)则需要遍历每一个单元格。

    根据业务需求,可以选择使用API,也可以选择遍历所有单元格。

  • 数据清洗:根据需求,结合Excel库的API,进行数据清洗。如:用默认值填写缺失数据的单元格,删除整个空行,删除重复数据,把不符合范围的数据删除掉,或者把日期数字的格式统一起来,等等。
  • 数据持续化:把处理好的数据回存至Excel文件,或者保存在数据库中或者CSV文件中。
  • 如何使用GcExcel实现数据清洗

    GcExcel有IRange的API,可以让数据清洗时代码写的更简单,因此下面我们选择用GcExcel的代码为例解决上面提到的几个场景。

    基于IRange,GcExcel提供一些快速查找的API,如下(在文件中查找特殊单元格):

    Workbook workbook = new Workbook();
     workbook.open("data.xlsx");
     IWorksheet sheet = workbook.getActiveSheet();
    
     //寻找sheet中,使用到的所有单元格
     IRange usedRange = sheet.getUsedRange();
    
     //寻找所有的公式单元格
     IRange allFormulas = sheet.getCells().specialCells(SpecialCellType.Formulas);
     //寻找所有的常量单元格
     IRange allConstants = sheet.getCells().specialCells(SpecialCellType.Constants);
    

    虽然GcExcel提供了API,但数据清洗时,也可能有需求需要遍历,下面是GcExcel遍历单元格的代码,后面我们就有可能会用到。

    public void FetchCellBasedOnRange(IRange area) {
       for (int column = 0; column < area.getColumns().getCount(); column++) {
         for (int row = 0; row < area.getRows().getCount(); row++) {
           IRange cell = area.get(row, column);
           //获取单元格的值
           Object val = cell.getValue();
         }
       }
     }
    

    场景一:缺失数据处理

    假如有一个Excel的数据,现在蓝色的格子是空的,我们需要对不同列下的蓝色格子做不同的处理,例如姓名的空格子替换为匿名,年龄替换成-1,身份证号填写N/A,住址填写为未知。

    代码如下:

    public void replaceBlankCell() {
       Workbook workbook = new Workbook();
       workbook.open("resources/BlankCells.xlsx");
       IWorksheet sheet = workbook.getActiveSheet();
       IRange blankRanges = sheet.getCells().specialCells(SpecialCellType.Blanks);
       for (IRange area : blankRanges.getAreas()) {
         for (int column = 0; column < area.getColumns().getCount(); column++) {
           for (int row = 0; row < area.getRows().getCount(); row++) {
             IRange cell = area.get(row, column);
             Object defaultVal = getDefaultVal(cell.getColumn());
             cell.setValue(defaultVal);
           }
         }
       }
    
       workbook.save("Result.xlsx");
     }
    
     private Object getDefaultVal(int column) {
       switch (column) {
         case 1:
           return "匿名";
         case 2:
           return -1;
         case 3:
           return "N/A";
         case 4:
           return "未知";
       }
       return null;
     }
    

    要注意的是,sheet.getCells().specialCells(SpecialCellType.Blanks);返回的区域是多个,因此我们需要遍历通过遍历areas来对每一个区域进行遍历。

    cell.getColumn()可以获取到当前格子对应到sheet上的第几列,因此获取默认值时使用该方法。

    场景二:错误数据判断

    错误数据的判断,与缺失数据处理相似,通过制定一些规则找出错误的值,对于错误值可以通过修改背景颜色进行高亮处理,用来提示,进行人工修改。

    通常规则可以有两种选择:

  • 使用Java直接编写判断逻辑。
  • 使用数据校验(Datavalidation)功能,或者条件格式(ConditionFormat)来进行处理。
  • 假如我们有下面一份数据,其中联系电话中有两条是错误的,位数不够,货物ID有两条是错误的,货物ID不能小于0,我们需要把他们找出来。

    public void MarkErrorData(){
    Workbook workbook = new Workbook();
    workbook.open("resources/ErrorData.xlsx");
    IWorksheet sheet = workbook.getActiveSheet();

    IRange telRange = sheet.getRange("C2:D5");
    for (int r=0; r

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论