配色: 字号:
Salesforce 数据清洗
2017-01-21 | 阅:  转:  |  分享 
  
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

复制代码

献花(0)
+1
(本文系thedust79首藏)