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('\n');            
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的数量等等,有兴趣需要的童鞋可以在此基础上进行优化。如果内容有错误地方欢迎指正,如果有问题的地方欢迎留言,转载请注明出处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏烂笔头

Python标准库笔记(5) — sched模块

目录[-] 事件调度 sched模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。 class sched.scheduler(timefu...

3445
来自专栏desperate633

LintCode 解码方法题目分析代码

样例 给你的消息为12,有两种方式解码 AB(12) 或者 L(12). 所以返回 2

764
来自专栏简书专栏

基于python的冒泡排序和选择排序

装饰器是python的高级用法,初学者需要单独学习1天才能理解并且熟练运用。 读者如果不理解本节内容,不影响后续内容的理解。 此装饰器只是计算函数运行花费的...

784
来自专栏编程

java知识点归纳

java新手知识点归纳-java基础部分 ? 一. Java的运行(基础必备) 这条可能出看很简单,java程序的运行谁不会呢?不过很多时候, 我们只是单纯通过...

1896
来自专栏Celebi的专栏

C/C++ 学习笔记七(内存管理)

工作中经常使用到C/C++,为对C有个比较深刻的了解,重新拾起学习C的任务。在看书的同时,记录下思考的过程,也记录下重要的知识点。

1920
来自专栏上善若水

001golang中的字符串编码问题无标题文章

HTMLEscape 函数将json编码的src中的<、>、&、U+2028 和U+2029字符替换为\u003c、\u003e、\u0026、\u2028、\...

1442
来自专栏蓝天

有关snprintf返回值

有关snprintf返回值更多信息,请参考:http://bbs.hadoopor.com/thread-1185-1-1.html

561
来自专栏轮子工厂

一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析

这就是为什么我们在浏览器的地址栏中能看到中文,但是把地址拷贝出来后中文就变成了一些奇怪的串了。

1934
来自专栏java一日一条

java中“==”和equal区别

8个月以后就要正式找工作啦,我觉得现在是时候花时间好好深入研究一下以前比较混肴的知识。这就当作是自我成长的第一步!

311
来自专栏IT杂记

关于Mapreduce On Yarn中Map数量的设置

同事最近对MR on Yarn中Map数量的一个小的研究,描述如下:     在新版MapReduce 中即 MR on yarn中,不支持设置Map数量。  ...

2087

扫码关注云+社区