文本数据按照字段实现groupby操作

需求:

    文本数据格式如下:

akc190|id_drg|name_drg|pdxCode|pdxName|sdxCodes|sdxNames|yka055

0001369157|101|癫痫发作(-)|G40.901|癫痫|G40.901$|癫痫$|1946.56
0001370448|101|癫痫发作(-)|G40.901|癫痫|G40.901$J40.x00$|癫痫$支气管炎$|2842.77
0001374918|101|癫痫发作(-)|R56.001|高热惊厥|R56.001$J03.900$|高热惊厥$急性扁桃体炎$|1813.14
0001358030|101|癫痫发作(-)|R56.001|高热惊厥|R56.001$J03.900$|高热惊厥$急性扁桃体炎$|2209.05
0001368014|101|癫痫发作(-)|G41.900|癫痫持续状态|G41.900$|癫痫持续状态$|2986.82
0001384553|101|癫痫发作(-)|G40.103|症状性局灶性癫痫|G40.103$|症状性局灶性癫痫$|1944.66
0001383190|101|癫痫发作(-)|R56.001|高热惊厥|R56.001$J06.900$|高热惊厥$急性上呼吸道感染$|2532.59

需要按照id_drg,pdxCode和sdxNames进行groupby操作,统计每种情况的病历数+费用数据

代码如下:

package com.cetc.chinadrgs.auto

import scala.collection.mutable.ListBuffer
import scala.io.Source

/**
  * Created by Shea on 2018/11/24.
  */
object GroupBy2Text extends App{
  val path="C:\\Users\\Shea\\Desktop\\drgs.txt"
  val encode="utf-8"
  val res=getCategoryAll(path,encode,"\\|","1,3")("6","\\$")
  getGroupRes(res,path,encode,"\\|","1,3")("6","\\$")("7","4")
  /**
    * 获取总的分类
    * @param path 文件路径
    * @param encode 编码
    * @param delimiter 字段间的分隔符
    * @param indexs 需要按照哪几个字段分组(此处为字段的索引),使用逗号拼接
    * @param splitFiled 如果有的分组字段的值为多个拼接值,是否需要拆分为集合
    * @param splitFlag 拼接的符号
    */
  def getCategoryAll(path:String,encode:String,delimiter:String,indexs:String)(splitFiled:String="",splitFlag:String): List[Set[String]] ={
    val groupList=new ListBuffer[Set[String]]
    Source.fromFile(path,encode).getLines().foreach{line=>
      val arr=line.split(delimiter)
      val fields=indexs.split("\\,")
      val specialField:Set[String]=delimiter match {
        case ""=>Set("")
        case _=>arr(splitFiled.toInt).split(splitFlag).toSet
      }
      //将普通字段拼接
      val common:String=fields.map(index=>arr(index.toInt)).mkString("\001")
      //与特殊字段splitFiled拼接
      val groupContent=specialField ++ Set(common)
      groupList.append(groupContent)
    }
    //得到最终的所有类
    val groupRes:List[Set[String]]=groupList.distinct.toList
    groupRes
  }

  /**
    * 生成结果
    * @param groupRes
    * @param path
    * @param encode
    * @param delimiter
    * @param indexs
    * @param splitFiled
    * @param splitFlag
    * @param parms 需要输出的其他字段相关内容(使用逗号拼接索引)
    */
  def getGroupRes(groupRes:List[Set[String]],path:String,encode:String,delimiter:String,indexs:String)(splitFiled:String="",splitFlag:String)(parms:String*): Unit ={
    for (str<-groupRes){
      var count=0//统计个数
      var groupFileds=""//分组字段
      //此处可以指定输出的其他相关字段内容----也可以几个字段就设定几个buffer
      val buffer = new StringBuffer()

      Source.fromFile(path,encode).getLines().foreach{line=>
        val arr=line.split(delimiter)
        val fields=indexs.split("\\,")
        val specialField:Set[String]=delimiter match {
          case ""=>Set("")
          case _=>arr(splitFiled.toInt).split(splitFlag).toSet
        }

        //将普通字段拼接
        val common:String=fields.map(index=>arr(index.toInt)).mkString("\001")
        //与特殊字段splitFiled拼接
        val groupContent=specialField ++ Set(common)
        if(str==groupContent){
          count+=1
          groupFileds=common
          val cont=parms.map(param=>arr(param.toInt)).mkString(",").trim
          buffer.append(cont+"@")
          /*akc190s.append(akc190+",")
          yka055s.append(arr(7)+",")
          pdx=pdxCode+","+pdxName*/
        }
      }
      //特殊分组字段
      val specialField=str.filterNot(_.contains("\001")).mkString(",")
      //输出最终结果
      println(s"${groupFileds}|${specialField}|${count}|${buffer.toString}")
    }
  }
}

最终处理结果如下:

id_drgpdxcode|sdxNames|yka055,pdxName|yka055,pdxName

101G40.901|癫痫|1|1946.56,癫痫@
101G40.901|癫痫,支气管炎|1|2842.77,癫痫@
101R56.001|高热惊厥,急性扁桃体炎|2|1813.14,高热惊厥@2209.05,高热惊厥@
101G41.900|癫痫持续状态|1|2986.82,癫痫持续状态@
101G40.103|症状性局灶性癫痫|1|1944.66,症状性局灶性癫痫@
101R56.001|高热惊厥,急性上呼吸道感染|1|2532.59,高热惊厥@

分析:

    最终结果是 同一个drg下,根据主诊断+次诊断一共有6中组合,

    其中主诊断为:R56.001->高热惊厥;

    次诊断为:高热惊厥+急性扁桃体炎;

    的组合有2个病例,费用分别为1813.14和2209.05

223916_bL9y_2663968.jpg
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java 中,可以使用各种开发框架和库来实现 ETL 数据清洗的功能。以下是一些常用的工具和技术: 1. Apache NiFi:NiFi 是一个基于流程图的数据流处理工具,可以实现数据提取、转换和加载等功能。在 NiFi 中,可以使用各种处理器来进行数据清洗,例如使用 SplitText 处理器来分割文本字段,使用 ReplaceText 处理器来替换文本中的特定内容等。 2. Spring Batch:Spring Batch 是一个轻量级的批处理框架,可以用于处理大规模的数据批量操作。在 Spring Batch 中,可以使用 ItemReader、ItemProcessor 和 ItemWriter 等类来进行数据清洗和转换,例如使用 ItemProcessor 进行数据过滤、转换和校验等操作。 3. Apache Camel:Camel 是一个企业级的集成框架,可以用于构建各种 ETL 流程。在 Camel 中,可以使用各种组件和路由器来进行数据清洗和转换,例如使用 Splitter 组件进行文本分割,使用 Bean 组件进行数据处理等。 4. Apache Spark:Spark 是一个基于内存的大数据处理框架,可以用于实现数据清洗、转换和分析等功能。在 Spark 中,可以使用 DataFrame 和 Spark SQL 等组件来进行数据处理,例如使用 select、filter、groupBy 等函数进行数据转换和聚合操作。 以上是一些常用的 Java 工具和框架,可以帮助实现 ETL 数据清洗的功能。当然,在具体实现时,还需要根据业务需求和数据特点进行适当的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值