Salesforce数据清洗
新系统上线后,需要导入历史数据,但是旧数据格式,数据缺失,数据错误,奇异值,属性归类与新系统有很大的gap。因此我们需要建立一套数据动态清洗规则给Salesforce系统,通过这些规则自动清洗导入数据,清洗规则可以让function自己配置。而不需要IT负责
下面将详细举一个例子如何在salesforce中做数据处理。数据清洗需要分成5个步骤
1,建立2个关联数据的Object的和一个数据清洗后台设置的Object的
2,数据导入页面csv
3,定义每个字段的范围、属性,如果是错误的则自动重新分配,或者修改成临近值
4,数据清洗合并。
5,导出错误数据到Excel
第一步,新建立两个关联的Recruit和RecruitDepartment,并且建立一个清洗规则的Object,当导入数据后我们可以读取设置的清洗规则,并对导入的数据进行清洗
第二步,对于清洗规则,我们只能有一条规则被激活,因此我们在插入新规则和更改旧规则的时候,我们需要添加一个tirgger针对Data_Washing_Setting,保证规则的唯一性。
复制代码
1triggerIsActiveCheckingonData_Washing_Setting__c(beforeinsert,beforeupdate){
2
3ListListOldData=[selectIdfromData_Washing_Setting__c
4whereActive_this_Rule__c=true];
5ListListNewData=trigger.new;
6
7//system.debug(''ListNewData:''+ListNewData.size());
8integeritemNum=0;
9if(trigger.isInsert)
10{
11if(trigger.isBefore)
12{
13for(Data_Washing_Setting__cdws:trigger.new)
14{
15if(dws.Active_this_Rule__c)
16{
17itemNum++;
18}
19}
20itemNum+=ListOldData.size();
21
22if(itemNum>1)
23{
24for(Data_Washing_Setting__cdws:trigger.new){
25dws.adderror(''onlyonerecordcanbeactived!plscheckyourhistorydataandtryagain.'');
26}
27}
28}
29}
30elseif(trigger.isUpdate)
31{
32if(trigger.isBefore)
33{
34//去掉更新的数据
35for(Data_Washing_Setting__cdws:trigger.new)
36{
37for(integeri=0;i 38if(dws.Id==ListOldData[i].Id)
39{
40ListOldData.remove(i);
41}
42}
43if(dws.Active_this_Rule__c)
44{
45itemNum++;
46}
47}
48itemNum+=ListOldData.size();
49if(itemNum>1)
50{
51for(Data_Washing_Setting__cdws:trigger.new){
52dws.adderror(''onlyonerecordcanbeactived!plscheckyourhistorydataandtryagain.'');
53}
54}
55
56}
57}
58}
复制代码
第三步,我们需要建立导入页面,并添加相应的验证按钮
VF的代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
复制代码
后台APEX导入代码
复制代码
1publicclassBatchInsertByCsvController{
2
3publicstringfileName{get;set;}
4//Blob:二进制对象类型。通过inputFile选中后的文件在后台获取的时候是一个Blob类型,
5publicBlobcontentFile{get;set;}
6publicString[]filelines=newString[]{};
7publicListRecruitList{get;set;}
8publicListBlankList{get;set;}
9publicListinvaildList{get;set;}
10//初始化
11publicPageReferenceLoadData()
12{
13try{
14filename=bitToString(contentFile,''ISO-8859-1'');
15filelines=fileName.split(''\n'');
16//ApexPages.Messagemsgs=newApexPages.Message(ApexPages.Severity.INFO,''importaccount:''+filelines.size());
17//ApexPages.addMessage(msgs);
18RecruitList=newList();
19string[]inputvalues;
20stringSwpNumber;
21
22for(Integeri=1;i 23{
24inputvalues=newstring[]{};
25inputvalues=filelines[i].split('','');
26Recruit__crecruits=newRecruit__c();
27recruits.Name=inputvalues[0];
28recruits.Position_Name__c=inputvalues[1];
29recruits.Recruit_Department__c=[SELECTId
30FROMRecruit_Department__c
31WHEREName=:inputvalues[2]LIMIT1].Id;
32recruits.Recruit_Type__c=inputvalues[3];
33SwpNumber=inputvalues[4];
34recruits.Recruit_Number__c=Decimal.valueOf(SwpNumber.trim());
35RecruitList.add(recruits);
36}
37}
38catch(exceptione){
39ApexPages.Messageerrormsg=newApexPages.Message(ApexPages.Severity.ERROR,''AnerrorhasoccuredreadingtheCSVfile:''+e.getMessage());
40ApexPages.addMessage(errormsg);
41}
42try{
43//insertRecruitList;
44//ApexPages.MessagesuccessMsg=newApexPages.Message(ApexPages.severity.INFO,''importsuccess'');
45//ApexPages.addMewww.tt951.comssage(successMsg);
46}
47catch(Exceptione)
48{
49//ApexPages.Messageerrormsg=newApexPages.Message(ApexPages.severity.ERROR,''Anerrorhasoccuredinsertingtherecords''+e.getMessage());
50//ApexPages.addMessage(errormsg);
51}
52returnnull;
53}
54//blob是二进制存储的,String是16进制存储的,所以使用此种方式加上编码解码等操作肯定会更加适应,包括中文
55privateStringbitToString(Blobinput,StringinCharset){
56//转换成16进制
57Stringhex=EncodingUtil.convertToHex(input);
58//一个String类型两个字节32位(bit),则一个String长度应该为两个16进制的长度,所以此处向右平移一个单位,即除以2
59//向右平移一个单位在正数情况下等同于除以2,负数情况下不等
60//eg900001001>>100000100结果为4
61finalIntegerbytesCount=hex.length()>>1;
62//声明String数组,长度为16进制转换成字符串的长度
63String[]bytes=newString[bytesCount];
64for(Integeri=0;i 65//将相邻两位的16进制字符串放在一个String中
66bytes[i]=hex.mid(i<<1,2);
67}
68//解码成指定charset的字符串
69returnEncodingUtil.urlDecode(''%''+String.join(bytes,''%''),inCharset);
70}
71//筛选空值
72publicPageReferenceLoadBlankList()
73{
74try
75{
76BlankList=newlist();
77DataWashingSettingdws=newDataWashingSetting();
78string[]flines=dws.AddQuestionsData(filelines);
79string[]inputvalues;
80stringSwpNumber;
81
82for(Integeri=0;i 83{
84inputvalues=newstring[]{};
85inputvalues=flines[i].split('','');
86Recruit__crecruits=newRecruit__c();
87recruits.Name=inputvalues[0];
88recruits.Position_Name__c=inputvalues[1];
89recruits.Recruit_Department__c=[SELECTId
90FROMRecruit_Department__c
91WHEREName=:inputvalues[2]LIMIT1].Id;
92recruits.Recruit_Type__c=inputvalues[3];
93SwpNumber=inputvalues[4];
94recruits.Recruit_Number__c=Decimal.valueOf(SwpNumber.trim());
95BlankList.add(recruits);
96}
97ApexPages.Messagemsgs=newApexPages.Message(ApexPages.Severity.INFO,''blanknum:''+BlankList.size());
98ApexPages.addMessage(msgs);
99}
100catch(Exceptione)
101{
102ApexPages.Messageerrormsg=newApexPages.Message(ApexPages.Severity.ERROR,''AnerrorhasoccuredreadingtheCSVfile:''+e.getMessage());
103ApexPages.addwww.baiyuewang.netMessage(errormsg);
104}
105returnnull;
106}
107publicPageReferenceExportBlankToCSV()
108{
109returnnewPageReference(''/apex/ExportCSV'');
110}
111}
复制代码
后台调用的验证清洗代码,可以根据需要任意添加
复制代码
1publicclassDataWashingSetting{
2
3//消除重复数据
4publicListDelDuplicateData(ListOriginalList)
5{
6setmyset=newset();
7Listresult=newList();
8
9myset.addAll(OriginalList);
10result.addAll(myset);
11
12returnresult;
13}
14//筛选为空数据
15publicstring[]AddQuestionsData(string[]filelines)
16{
17string[]result=newstring[]{};
18string[]inputvalues;
19for(Integeri=1;i 20{
21inputvalues=newstring[]{};
22inputvalues=filelines[i].split('','');
23if(inputvalues[0]==''''||inputvalues[1]==''''||inputvalues[2]==''''
24||inputvalues[3]==''''||inputvalues[4]=='''')
25{
26result.add(filelines[i]);
27}
28}
29returnresult;
30}
31//检测各个字段的合理性
32publicstring[]CheckFiled(string[]filelines)
33{
34//读取规则
35Data_Washing_Setting__cdws=[selectPosition_Name_Rule__c,
36Recruit_End_Number__c,Recruit_Department_Rule__c,Recruit_Start_Number__cfromData_Washing_Setting__cwhereActive_this_Rule__c=true];
37stringPositionNameRule=dws.Position_Name_Rule__c;//部门规则是否允许重复
38decimalstartNumber=dws.Recruit_Start_Number__c;//招聘人数底线
39decimalendNumber=dws.Recruit_End_Number__c;//招聘人数上线
40stringdepartment=dws.Recruit_Department_Rule__c;//部门限制
41
42string[]result=newstring[]{};
43string[]inputvalues;
44for(Integeri=1;i 45{
46inputvalues=newstring[]{};
47inputvalues=filelines[i].split('','');
48//填写验证代码
49}
50returnresult;//返回不合格代码
51}
52}
复制代码
出现问题数据直接导出问题数据到Excel,手动处理后再导入。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
复制代码
|
|