导入数据高级教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
导入数据高级教程
文/叶竹其
目录
一、导入数据来源
1.从软件导出数据
2.从数据库表导出
二、高级处理技巧
1.筛选列的不重复值
2.内容编码查询替换
四、常用辅助工具
1.EXCEL/记事本
2.思迅新通用导入工具
3.思迅基本资料导入工具
4.文本处理工具集
一、导入数据来源
既然是导入,是将数据从一个地方导入到另一个地方,从一种格式转换成另一种格式,原始数据就有一个来源问题。新上线系统,数据可能来源于大量EXCEL表格,需要进行合并统一处理;切换上线系统,数据一般来源于旧系统。从旧系统中提取原始数据,又有两种方式,一种是根据原有软件的报表、打印、导出等功能将查询的相应数据导出成中间格式(一般用EXCEL),还有就是直接查询导出原软件的数据库表的数据。
1、从软件导出数据:
此方式特点是查询容易,数据直观,可以先进行数据的条件筛选、排序、列选择,确定好具体数据内容格式、数据范围后再导出,操作也比较便利。缺点就是有些软件部分资料没有提供导出功能(我见过几款软件的品类资料是没法直接导出的)、所见的资料项是最终数据内容而我们可能需要数据内容的编码(比如商品资料中的品类、供应商),使用这里导出的数据就需要对这些资料项进行编码替换[参见二(2)节]。
2、从数据库表导出:
此方式特点是可以取得完全原始数据,但需要手工再进行过滤、处理,可能会碰到几个小问题:一个是表定位,我们可能无法事先知道相应数据存储的表,除了手工一张张翻(本人以前还真这么干过),用SQL的事件探查器可以比较方便地分析出相应数据存储的表,打开事件探查器后,操作查询相应数据,再稍作分析即得可知。一个是字段字位,原始数据库表自然有很多字段,需要用到的实际数据项使用哪些字段又要分析了,除了字段名(一般用英文关键字、拼音首字母),我们可以根据字段数据的内容定位出数据项,特别是通过对比某项数据不同的两行,或者对某个数据项更改前后的结果进行对比,确定出具体数据项使用的字段。
综上,一次数据导出导入处理是使用哪种方式,是要看数据具体情况分析决定,通常都会两种方式结合使用,以保证数据完整性、准确性和处理效率。
二、高级处理技巧
1.筛选列的不重复值
不同软件的功能架构及数据库结构不一样,因此对数据的存储方式也不一样,不同系统中转换可能需要进行部分数据的表对应关系处理。比如:某软件的品牌资料是作为商品的资料项直接存储在商品资料表中,某软件的价格信息不存储在商品资料表中,是另以货号索引在一张独立的表中。相应即为两种情况:原始数据没有我们需要的单独表,需要从数据项中提取建立。原始数据项分布在单独一张表中,需要我们合并作为一张表的数据项。
对于没有单独数据表的,一般提取所有资料项并去重处理(即提取不重复资料项)并给予编码及建立一张表,将该项资料在新表的编码填充进原资料表中的相应资料项。
筛选列的不重复值,这个相信很多朋友都知道,通过EXCEL的“筛选”功能就可以实现,点击筛选按钮旁的“高级”,列表区域为选定的列,勾选“选择不重复的记录”,确定后,该列数据项有重复的将只显示一行,此时可将此列复制得到不重复的数据项。
EXCEL 2003好像是不支持此功能,或者实现方式比较烦琐,我多年前曾用VB写过一个小工具也可以作此处理:
2.内容编码查询替换
对于导入数据是从软件导出的,数据项通常为最终呈现的内容数据,或者原始数据就是直接以数据内容存储的情况,我们可能需要的是数据编码,就需要对这部分内容与编码的对应进行处理。
资料项是具体数据,需要转换成另一个资料表的对应编码,这个在数据不多的时候可以用手工替换处理,有几种数据就替换几次,直至全部替换完成。数据量大的时候这么处理就不现实了,这个情况EXCEL应该也处理不了,但可以用SQL简单处理。方法是将资料项作一个EXCEL或TXT单独导入一张临时表,用查询语句去来源数据表查询得到对应数据项并保存在同张表的另一列,再将查询结果列复制或表导出,替换资料表的内容列(或新增一列),完成内容与编码的对应转换。举个例子,导入临时表名t_temp,字段cls(分类名称),cls_no(准备获取的分类编码);分类数据表t_bd_item_cls,字段item_clsno(分类编码),item_clsname(分类名称)。那么,将来源表格中的分类列内容导入到临时表t_temp,查询语句为:Update t_temp set cls_no=(select top 1 item_clsno from t_bd_item_info where
item_clsname=cls)
(如果两张表有字段名称相同,可以用”表名.字段”表示)
此语句是一个嵌套查询,对该表所有行处理,写入字段cls_no(准备获得的分类编码),值为根据该行的cls字段(分类名称)去t_bd_item_info表查询与clsname(分类名称)字段数据相等的同一行的clsclsno(分类编码)字段。理解不了语句的,中文这么解释估计也难理解,这是个逻辑问题。
有用过这方式取过数据的人可能会发现这么操作有个问题,就是从原始来源EXCEL表复制了这一列导入之后,或者是查询生成了对应新列数据后,查询或导出时该表的数据排序变了,不是原始导入的数据行顺序,这样就完成不了对应的数据与编码的对应替换,这怎么
办呢?
因为SQL的排序是根据列的一定规则进行的,导入后按默认排序规则造成排序变动,解决办法也很简单,我们多导入一列用于排序,导入前按行顺序生成个数字序列作第一列,一并导入,即可解决此问。EXCEL复制列值到TXT,(TXT导入SQL),SQL查询编码,编码列复制到EXCEL表格的相关截图:
实践中,还可能存在一个问题。原始列内容中存在重复项目,那么根据我们的查询语句,它将查出第一个出现的该内容对应的编码,造成与实际数据的偏差。而我们在原始资料EXCEL 表中,仅从数据内容看不出其实际应取的编码。这种情况怎么处理呢?有三种方式供参考:
A、先对重复的数据项进行去重处理,在原来软件中稍加改变重复项目的内容(列名后加
个数字等),再重新导出后,不再重复后即可得到根据内容准确取到唯一对应编码。
B、放弃使用软件导出方式,因为该列数据存在重复,导出后无法区分原始取值。改用
从数据库表导出数据再作处理。
C、因为数据行范围可能不一样,我们可能需要软件导出的结果集,但因为无法根据列
内容取得实际对应的编码,但其实可以根据数据的其他条件去查询,比如根据货号
查询得到分类编码,再替换进处理表格。这个方式有一定前提,就是这个查询条件
也要具体唯一性,不存在重复行(一般使用货号或条码)。
举个例子,准备及导入临时表t_temp,字段id,item_no(货号),clsname(分类名-可不
需要),clsno(准备获取的分类编码);商品资料表t_bd_item_info,字段item_no(货
号),item_clsno(所属分类编码)。那么,取得分类对应编码的语句为:
Update t_temp set clsno=(select top 1 item_clsno from t_bd_item_info where
t_bd_item_info.item_no=t_temp.item_no)
这样就近乎完美完成了资料项从内容到编码的对应替换。
上述方法同样适用于,当一个列表需要从一个大结果数据集(表)中对比/查询对应列
数据的方法。这个好像是可以用EXCEL完成,但我没以前没整明白,因为操作太繁
琐而逻辑其实是简单清晰的话我希望有个简便的方式处理,所以我曾也写过个小工
具可以处理这样文本对比或查询对比输出:
四、常用辅助工具