一个批量数据导入的实现方案

2023-11-03

        数据导入作为系统常用的功能,几乎所有的系统都应该支持,主要用于系统初期,大批量初始化数据,或者需要输入的数据行比较多的情况(导入在建项目的交付清单,通常成百上千项)。
        数据导入的一般过程是,用户按照模板格式Excel文件,然后程序读取这个文件,根据列进行对应,逐行将数据写入到系统中。

一,先讲讲模板:
        一般使用Excel模板,所谓模板就是约定Excel的每一列对应系统的哪一列的值,对应方式有两种,一是根据顺序匹配,二是根据列名匹配。所谓根据顺序匹配,是约定第一列(A列)对应系统数据库的那一列,B列对应哪一列。这种模板可以没有标题行,也可以有多行标题。所谓列名匹配,是指定列的名字进行匹配,这种情况需要有标题行。匹配时要指明是否忽略掉标题中的空格,*号,因为有些模板中会使用*来表示该列是必输列,也有可能有空格。
        还有,可能还需要指定标题或者数据的起始行数,因为有时候数据并不一定从第2行开始,有可能模板数据有个大大的标题,比如“xx单位培训上报名单”,其后才是标题行和数据行。
        除了excel形式的模板,还有.csv格式,所谓“CSV”,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。就是列与列之间用逗号分隔,现在不是很常用了。其实.csv文件也可以用Excel打开的。
        系统模板下载。用户要使用模板导入数据,首先先要获得模板,系统可以提供一个模板下载的功能,可以在数据导入界面或者一个统一的下载界面,提供模板下载功能,这样,用户就不用到处找模板在哪里,打电话给你要模板了。推荐在数据导入界面直接下载模板。并且,系统应该根据导入方案自动生成模板,而不是人为加工再上传到服务器。这样就极大避免了模板过期,与方案不匹配的问题。

二,导入
导入方式有很多种,下面逐个讨论之。
1,编写通用的服务端导入程序。
       对一些简单的没有检查逻辑的数据,可以写通用的导入程序,这样效率还高。比如我们的条码系统就写了一个通用的excel导入。效率还是很高的。通用导入程序,定义模板文件与数据库表之间的对应关系,还有其他的一些逻辑,比如根据编号查找名称,带出其他列等等。也可以定义数据检查逻辑。系统读入excel文件,将数据传送到服务端,服务端要用数据导入程序,逐行读数数据,根据定义的检查逻辑检查数据是否合法,并将数据写入到指定的表。这种导入程序,有很多中复杂的情况需要处理:
(1)自动编码。

         一般我们录入订单或者入库单的时候,单号可以自动形成,根据一定的形成规则,这种规则一般是通过后台程序来实现的,导入程序要提供这方面的支持,比如,定义某个编码列,以及引用的编码规则,指导导入程序调用适当的编号形成程序形成代码。
(2)根据A列带出B列的内容。

         比如,根据输入的员工号,带出员工所属的部门代码。这种业务场景,还需要定义列写入的顺序。先代出,然后可以覆盖(带出的为默认值)。
(3)根据名称找编码。

         比如导入员工表,员工所属部门,数据库中保存的是编号,但是模板中可能是填写的部门名称。就需要根据名称找到编码,写到数据库中。导入程序就要定义查找关系。

(4)导入范围。

        上面的根据名称找编码的逻辑看上去很简单,但是实际应用中还有个更复杂的情况,设想再一个集团企业中,不同的分支机构中的部门可能是相同的(人力资源部都叫人力资源部),在不同的机构中导入,就应该仅仅查找该机构下的编码。这就涉及到数据导入范围的概念。要抽象出数据导入范围这个概念,而且导入范围的限定还不一定来自一个条件,可能是多个条件。导入程序定义界面需要指定导入范围由什么来确定,比如用组织机构;定义好导入范围后,比如按照组织机构来限定范围。导入时要提供导入范围选择界面,并把导入范围选择的值应用到导入逻辑中(比如在根据部门名称查找部门编码时,加上组织机构的限制)。

(5)定义”无值“的表示方式。

         考虑下手工录入的场景,某一列的内容我完全可以不录入,导入时,如何区分”不录入“这种场景呢,可以定义一个特殊的值,比如”<n/a>“表示该单元格不导入。因为在某些场景下(比如更新模式),是需要区分”不修改“还是”修改为空“这两种情况的。
(6)数据的合法性检查逻辑。

         导入时,要先检查数据是否合法,这就需要定义一种检查逻辑或者说是语法。比如编码存在性检查,数据格式检查(数字列输入了非数字值),数据宽度,数据范围(只能输入0/1/2/3),甚至有的列的检查依赖于其他列的值,比如证件号码的合法性,依赖于证件类型:身份证,港澳通行证,士兵证等等。有些有效性可以通过定义正则表达式来检查,有些就比较复杂了。希望大家学习下正则表达式的知识。

2,界面模拟录入的导入方式
        第一种方式,大家可以发现,需要定义大量的规则,而这些规则,在界面录入编码过程中都已经实现了,如果能充分利用已经实现的这些规则,将会避免大量的重复性工作,并且有些逻辑可能通过第一种方式实现不了。
这种情况一般是采用模拟键盘输入的方式,从模板中读取数据,填到界面的特定录入框,然后界面自然会调用已经实现的逻辑,复用了程序代码。

       这两种方式各有优缺点。第一种方式优点是效率很高,适合大批量的数据导入。以前做过一个项目,需要的导入大量的数据,由于时间比较紧急,刚开始采用第二种方式,每秒才能导入不到1条数据。1000条数据就要差不多20分钟,用户不干了,因为要导入的数据不止1000行。不得已才采用了第1种方式。但第一种方式定义起来麻烦。第二种方式的优缺点与第一种正好相反。而且对界面编程要求比较高 。在做输入界面的时候,就要提前考虑好这种导入,给这种模拟输入的导入提供方便。

3,模拟导入
       无论哪种方式,都要提供模拟导入的功能,以便检查数据错误。
       第一种方式,通过数据检查逻辑,对数据进行检查,并提供详细的检查报告。并且导入结束后,能将导入失败的原因写入到源文件的对应行,这样方便用户修正。
       第二种方式,可以提供模拟导入的功能,吧错误检查出来,同样,也能将检查出来的错误,写入到源文件中。
       至于选择那种方式,可以根据具体的业务场景进行抉择。数据校验少,不复杂的,对效率要求高的,选择第一种方式,否则选择第二种方式。
       导入时,还可以支持过滤条件,比如只导入数据源中符合条件的某些数据。

4、其他
      应该支持同时导入多个模板文件。导入时,同时选择多个excel文件,逐个排队导入。

三,导入的其他复杂情况
1,导入父子表
一般的业务凭证,都是父子表结构,比如财务凭证,有凭证头,多条分录。这就是典型的父子表。更复杂的还有多个、多级父子表。
可以将这种多级关系抽闲成数据行的级次情况,,或通过列缩进的方式来体现父子关系。

其实,你看如果按照上面的格式定义,导入程序是能工作的。
但是!这样会将模板搞的忒复杂了,易用性不好。其实excel导入最适合的就是简单的二维表,没有这么复杂的结构。否则就适得其反了,光是输入这么复杂的表,就够麻烦的了,何不直接在系统中录入呢。
一般这种父子表的导入可以采用多次导入的方式来实现,先导入表头,再导入明细。表头和明细使用不同的模板。

2、导入多个表
有时候在系统设计的时候,业务上的一个数据可能会保存到多个物理表中。那么在导入的时候,就需要支持这种场景,你不能让用户导入多次。在定义导入的时候,指定多个目标表,然后在定义导入目标列时,可以从多个表中选择。多个表通过数据的KEY关联。如果KEY是自动形成的,那么只在导入第一个表时自动生成,导入后边的表时,直接拿过来用就好了。

3、导入组的概念
上面导入父子表的例子,最后给出的方案是表头和明细定义不同模板,分别导入的方案。这种方案是可行的,但是用户实际用起来稍有点麻烦,需要做两次导入操作。其实除了导入这种父子表的例子,还有一种场景,抽象讲,我导入了A表的内容,同时希望在B表中也插入部分数据;另外的场景就是上面说的,导入多个表。
以上场景,我们可以定义多个导入方案,然后把多个导入方案组合在一起,组成一个“导入组”,自动按顺序执行导入组中的每个方案。满足以上的场景。方案组中的每个方案的数据可以来自不同的数据文件,也可以来自同一个文件。

4,导入文件附件
确实有这种需求,比如导入商品主数据,系统可能需要给每个商品配个照片,这个照片存放在本地文件系统,用户希望在导入模板中输入图片的地址。
导入图片就不像模拟键盘输入这么简单了,需要特殊的导入程序。这就需要专门根据这种特殊的需求来发专门的程序了,由导入程序来调用,也有可能是录入界面来调用(如果是在单据录入界面导入的话)。可以开发一种支持附件导入的程序,通过约定附件的制定格式(比如在模板中制定附件的位置)

5,将导入结果回写到excel模板中。
将导入结果反写到excel中,便于用户查看,方便用户做后续额的处理,比如显示某条数据是否导入成功,如果没有导入成功,显示失败的原因,便于用户根据错误原因,调整数据。数据模板中可以提供两个固定的列(导入状态,状态说明),前者存放是否导入成功,成功,显示“成功”,失败显示失败,并在导入文本中显示具体的失败原因,可能是数据部符合要求,也可能是系统出错了等等。
并提供一个导入进度指示,比如显示一个列表,列出所有需要导入的数据行,根据导入的进度,滚动这个列表,并在列表中实时显示导入结果,成功,失败,失败原因等等。

 

转载于:https://www.cnblogs.com/senline/p/10011254.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个批量数据导入的实现方案 的相关文章

  • 【2024】基于springboot的爱心捐款救助平台课题开发

    目录 一 整体目录 文档含项目摘要 前言 技术介绍 可行性分析 流程图 结构图 ER属性图 数据库表结构信息 功能介绍 测试致谢等约1万字等 二 运行截图 三 代码部分 示范 四 数据库表 示范 数据库表有注释 可以导出数据字典及更新数据库
  • AntDB内存管理之内存上下文之内存上下文机制是怎么实现的

    4 内存上下文机制是怎么实现的 下文将针对内存上下文机制进行代码说明 本次以AntDB的代码为例 来解析内存上下文的实现方式 4 1 最基础的数据结构 MemoryContextData和MemoryContextMethods是内存上下文
  • 【计算机毕业设计】个人日常事务管理系统

    进入21世纪网络和计算机得到了飞速发展 并和生活进行了紧密的结合 目前 网络的运行速度以达到了千兆 覆盖范围更是深入到生活中的角角落落 这就促使 管理系统的发展 管理系统可以实现远程处理事务 远程工作信息和随时追踪工作的状态 网上管理系统给
  • 【计算机毕业设计】学生就业管理系统

    如今社会上各行各业 都喜欢用自己行业的专属软件工作 互联网发展到这个时候 人们已经发现离不开了互联网 新技术的产生 往往能解决一些老技术的弊端问题 因为传统学生就业信息管理难度大 容错率低 管理人员处理数据费工费时 所以专门为解决这个难题开
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • 【计算机毕业设计】北关村基本办公管理系统

    在如今社会上 关于信息上面的处理 没有任何一个企业或者个人会忽视 如何让信息急速传递 并且归档储存查询 采用之前的纸张记录模式已经不符合当前使用要求了 所以 对北关村基本办公信息管理的提升 也为了对北关村基本办公信息进行更好的维护 北关村基
  • 38条Web测试经验分享

    1 页面链接检查 每一个链接是否都有对应的页面 并且页面之间切换正确 可以使用一些工具 如LinkBotPro File AIDCS HTML Link Validater Xenu等工具 LinkBotPro不支持中文 中文字符显示为乱码
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器

    场景 Mybatis Plus 简称MP 是一个Mybatis的增强工具 只是在Mybatis的基础上做了增强却不做改变 MyBatis Plus支持所有Mybatis原生的特性 所以引入Mybatis Plus不会对现有的Mybatis构
  • MongoDB - 整合 SpringBoot 操作全流程

    目录 一 MongoDB 整合 SpringBoot 1 1 引入依赖 1 2 配置文件 1 3 集合操作 1 4 相关注解 1 5 文档操作 1 5 1 查询 1 5 2 更新 1 5 3 删除 一 MongoDB 整合 SpringBo
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升

随机推荐

  • catkin build 的使用

    1 catkin build vs catkin make 初学的时候一般我们用catkin make 但是相较于catkin build而言 并没有那么好使 对比如下 catkin make 同时编译工作空间下的所有包 速度慢 不灵活 c
  • C++(11):生成随机字符串

    C 11 产生随机数 c 11 随机数 风静如云的博客 CSDN博客 介绍了如何生成随机数 可以基于随机数生成随机字符串 include
  • 华为OD机试 - 字符串划分(Java)

    题目描述 给定一个小写字母组成的字符串 s 请找出字符串中两个不同位置的字符作为分割点 使得字符串分成三个连续子串且子串权重相等 注意子串不包含分割点 若能找到满足条件的两个分割点 请输出这两个分割点在字符串中的位置下标 若不能找到满足条件
  • HTML中的table表格

    表格标签 分为行 tr 和列 td 行及列都可以进行合并操作 table 定义表格 tr 定义行 td 定义列 先有行 后有列 th 多用于表头 定义表格中头部 加粗 border 边框大小 bordercolor 边框的颜色 cellpa
  • Spring的两种动态代理:Jdk和Cglib 的区别和实现

    一 原理区别 java动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 而cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子类来处理 1
  • 重构——重构原则

    何谓重构 目的在于不改变软件可观察行为的前提下 提高其可理解性 降低其修改成本 重构可能会在软件内部做修改 但是对软件的外部行为造成很小改变 或者不造成改变 与之相比的是性能优化 为何重构 程序的设计会逐渐腐败 当人们只为了短期目的 或者未
  • 实用工具系列 - Pycharm插件推荐

    博客主页 Passerby Wang的博客 CSDN博客 系统运维 云计算 Linux基础领域博主 所属专栏 实用工具系列 上期文章 实用工具系列 Pycharm安装下载使用 如觉得博主文章写的不错或对你有所帮助的话 还望大家多多支持呀 关
  • 云计算虚拟化:k8s二进制Master主备集群部署

    一 前言 无论从成本还是效率上考虑 k8s都极占优势 基本代表了未来趋势 官网推荐kubeadm配置 虽然方便 但掩盖了许多细节问题 k8s虽然咋看仅仅是个容器编排工具 但涉及的相关知识面非常广泛 如果说大数据的相关知识你需要花N天 K8S
  • do{...} while(0) 用意

    linux内核和其他一些开源的代码中 经常会遇到这样的代码 do while 0 这样的代码一看就不是一个循环 do while表面上在这里一点意义都没有 那么为什么要这么用呢 实际上 do while 0 的作用远大于美化你的代码 查了些
  • 人工智能革命:从ANI到AGI的道路

    从ANI到AGI的道路为什么这么难 没有什么比学习创造一台像人类一样聪明的电脑这种难以置信的创造更能让人欣赏人类的智慧了 建造摩天大楼 将人类置于太空中 弄清楚大爆炸如何发生的细节 这些都比了解我们自己的大脑或如何制造像它一样酷的东西要容易
  • docker harbor的安装使用以及镜像上传和拉取

    目录 harbor harbor安装 harbor上传和拉取镜像 上传 1 登录Harbor 2 打标签 3 上传镜像 拉取 1 登录Harbor 2 拉取镜像 harbor harbor是一个开源的容器镜像仓库 可用于存储和分发docke
  • 电脑怎么加快网页打开速度?加快网速。

    电脑怎么加快网页打开速度 加快网速 更换合适的dns可以直接加快网页打开速度 1 使用软件更换dns 下载地址 2 手动输入dns 1 win R键 输入 ncpa cpl 2 依次点击连接的网络 属性 Internet协议版本 TCP I
  • 【每日一题】排序子序列(贪心)

    题目来源 牛客网 链接 排序子序列 题目描述 牛牛定义排序子序列为一个数组中一段连续的子序列 并且这段子序列是非递增或者非递减排序的 牛牛有一个长度为n的整数数组A 他现在有一个任务是把数组A分为若干段排序子序列 牛牛想知道他最少可以把这个
  • PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.3 用天平找小球

    import java util Scanner public class Main public static void main String args Scanner sc new Scanner System in
  • 【总线】I2C 通信协议

    目录 I2C 总线协议概述 参数总结 I2C 的工作原理 寻址 读 写位 数据帧 I2C数据传输的步骤 具有多个从机的单个主机 具有多个从机的多个主机 I2C的优缺点 优点 缺点 文章参考 I2C 总线协议概述 I2C 总线广泛应用在 OL
  • 在B站如何不动一根手指,就可以养成6级大佬?大四学生发明养号神器,看完你也会...

    杨净 发自 凹非寺 量子位 报道 公众号 QbitAI 如何像拥有一个小助手一样 每天帮你签到打卡 或许 现在利用GitHub Action定时任务就可以做到 而这个小助手 混迹b站 可以每天按时按点签到打卡 看视频投币 定期充电 每天任务
  • leetcode 1024. 视频拼接

    你将会获得一系列视频片段 这些片段来自于一项持续时长为 T 秒的体育赛事 这些片段可能有所重叠 也可能长度不一 视频片段 clips i 都用区间进行表示 开始于 clips i 0 并于 clips i 1 结束 我们甚至可以对这些片段自
  • Prometheus+grafana

    Prometheus grafana 文章目录 Prometheus grafana 安装部署 常用指标监控 进程监控 docker容器的监控 安装部署 使用docker的方式部署 1 创建项目目录 root 129 mkdir home
  • timedate如何查看当前时间并去除毫秒

    import datetime dt datetime datetime strptime str datetime datetime now replace microsecond 0 Y m d H M S datetime datet
  • 一个批量数据导入的实现方案

    数据导入作为系统常用的功能 几乎所有的系统都应该支持 主要用于系统初期 大批量初始化数据 或者需要输入的数据行比较多的情况 导入在建项目的交付清单 通常成百上千项 数据导入的一般过程是 用户按照模板格式Excel文件 然后程序读取这个文件