zoukankan      html  css  js  c++  java
  • salesforce 零基础学习(二十四)解析csv格式内容

    salesforce中支持对csv格式的内容批量导入,可以使用dataloader,然而有些情况下,当用户没有相关权限使用dataloader导入情况下,就的需要使用VF和apex代码来搞定。

    基本想法:

      1.通过<apex:inputFile>标签弹出选择文件对话框,选择相应的csv文件;

      2.将相关csv文件转换成字符串并加以解析;

      3.将解析的字符串通过相关分隔存储到列表中,并插入到数据库。

    储备知识:

    1.csv:具有以下特征:

    1. 纯文本;
    2. 由记录组成(典型的是每行一条记录);
    3. 每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分隔符可以包括可选的空格);
    4. 每条记录都有同样的字段序列。

    此csv文件通过记事本打开显示内容如下:

    2.Blob:二进制对象类型。通过inputFile选中后的文件在后台获取的时候是一个Blob类型,此类型为二进制类型。通过相关转换可以将其转换成String类型,后续代码中会提供。

    注:一个String类型字符串占四个字节,32位,两个16进制字符的长度。

    功能制作:

    1.表结构:Vendor__c里面有三个字段,分别为:

    Vendor_Code__c ,Vendor_Code_EN__c ,Vendor_Name__c,三个字段类型均为Text类型。

    2.BatchInsertByCsvController

     1 public class BatchInsertByCsvController 
     2 {
     3     public string fileName{get;set;}
     4     public Blob contentFile{get;set;}
     5     String[] filelines = new String[]{};
     6     public List<Vendor__c> vendorList;
     7     
     8     public Pagereference ReadFileAndOperate()
     9     {
    10         try{        
    11             fileName =bitToString( contentFile,'ISO-8859-1');           
    12             filelines = fileName.split('
    ');            
    13             vendorList = new List<Vendor__c>();
    14             for (Integer i=1;i<filelines.size();i++)
    15             {
    16                 String[] inputvalues = new String[]{};
    17                 inputvalues = filelines[i].split(',');
    18                 Vendor__c vendor = new PRDS_Vendor__c();
    19                 vendor.Vendor_Code__c = inputvalues[0];
    20                 vendor.Vendor_Code_EN__c = inputvalues[1];
    21                 vendor.Vendor_Name__c = inputvalues[2];
    22                 vendorList.add(vendor);
    23             }
    24          }
    25          catch(Exception e){
    26                  ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured reading the CSV file'+e.getMessage());
    27                  ApexPages.addMessage(errormsg);
    28          }       
    29         try{
    30             insert vendorList;
    31             ApexPages.Message successMsg = new ApexPages.Message(ApexPages.severity.INFO,'import success');
    32             ApexPages.addMessage(successMsg);
    33         }
    34         catch (Exception e)
    35         {
    36             ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured inserting the records'+e.getMessage());
    37             ApexPages.addMessage(errormsg);
    38         }
    39         return null;
    40     }
    41    
    42     public List<PRDS_Vendor__c> getuploadedVendors()
    43     {
    44         if (vendorList!= null) {
    45             if (vendorList.size() > 0) {
    46                 return vendorList;
    47             } else {
    48                 return null;                    
             }
    49 }else { 50 return null;
           }
    51 } 52 53 public static String bitToString(Blob input, String inCharset){ 54 //转换成16进制 55 String hex = EncodingUtil.convertToHex(input); 56 //一个String类型两个字节 32位(bit),则一个String长度应该为两个16进制的长度,所以此处向右平移一个单位,即除以2 57 //向右平移一个单位在正数情况下等同于除以2,负数情况下不等 58 //eg 9 00001001 >>1 00000100 结果为4 59 final Integer bytesCount = hex.length() >> 1; 60 //声明String数组,长度为16进制转换成字符串的长度 61 String[] bytes = new String[bytesCount]; 62 for(Integer i = 0; i < bytesCount; ++i) { 63 //将相邻两位的16进制字符串放在一个String中 64 bytes[i] = hex.mid(i << 1, 2); 65 } 66 //解码成指定charset的字符串 67 return EncodingUtil.urlDecode('%' + String.join(bytes, '%'), inCharset); 68 } 69 }

    3.UploadVendorPage

     1 <apex:page sidebar="false" controller="BatchInsertByCsvController" showHeader="false">
     2    <apex:form >
     3       <apex:sectionHeader title="通过csv文件导入vendor"/>
     4       <apex:pagemessages />
     5       <apex:pageBlock >
     6              <center>
     7               <apex:inputFile value="{!contentFile}" filename="{!fileName}" /> 
     8               <apex:commandButton action="{!ReadFileAndOperate}" value="Batch insert"/>
     9              </center>  
    10       </apex:pageBlock>       
    11    </apex:form>   
    12 </apex:page>

     展示:csv文件格式需要如上图所示,A列Vendor Code,B列Vendor Code EN,C列Vendor Name.选择文件后点击Batch insert即可将数据插入到数据库中。

    总结:csv文件格式为纯文本文件格式,按照行组成。解析时只要通过回车符以及,进行相关分割便可以获取到相关的内容。上述代码没有太优化,比如上述代码如果csv文件超过10000便超过insert的数量等等,有兴趣需要的童鞋可以在此基础上进行优化。如果内容有错误地方欢迎指正,如果有问题的地方欢迎留言,转载请注明出处。

  • 相关阅读:
    opencv图像直方图均衡化及其原理
    转 让FPGA替代GPU的6大顾虑,你确定不看看吗?
    算法工程师到底在干嘛
    转 经典分类网络Googlenet
    darknet是如何对数据集做预处理的
    目标检测评价指标mAP 精准率和召回率
    opencv代码片段合集
    GAN简介
    【登录测试】登录模块的测试点
    【Jmeter自学】Jmeter里的指标
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/5542620.html
Copyright © 2011-2022 走看看