需求:
文本数据格式如下:
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