linq 清除一条数据中的某个字段值_B端通用批量数据导入方案设计

8241264c596752739b2629c912b18dbf.gif

点击上方蓝色字体,关注我

B端通用批量数据导入方案设计

文 | 3548字

估计阅读 | 9分钟

引题

B端产品经常遇到大量数据录入的需求。如春季招聘完成后,给新招的120个员工建立员工档案,并创建员工帐号。如果逐条将大量的数据录入系统,将花费用户不少的时间。

1124b265acf78ac07e3e7c171b9c816b.png

新员工的员工信息通常会填写在一个excel表格中,人力在汇总后,录入系统。

如果逐个录入,每创建一个员工的员工档案,有以下几个步骤:

1. 打开创建员工档案的表单页;

2. 对照着员工信息,在表单中输入员工姓名、手机号、身份证号······;

3. 保存数据;

4. 打开新的表单页,重复以上操作。

如果录入1个员工需要1分钟,120个员工,就需要花费2个小时。

与此同时,用户在大量地、重复做同样的操作时,犯错的概率也会增加。这导致录入的数据可能出现问题。

1124b265acf78ac07e3e7c171b9c816b.png

将张三的身份证号,错误地粘贴到了李四的员工档案中,或者填写到其他的字段中。

在批量数据录入场景下,数据导入功能,用户可以将正确的原始数据整理到表格中,快速导入到数据库。有效解决“逐条数据录入效率低下”和“操作失误导致数据错误”问题。

如何设计批量数据导入功能?

用户在批量导入数据前,需要先将要录入系统的数据,整理成导入文件。再将导入文件上传到系统中,系统完成数据校验后,再将导入文件中的数据,写入数据库。

从这个流程可以得出,批量数据导入功能的核心点有:合理设计导入模版、明确数据校验规则、异步导入数据、导入结果处理。

1.合理设计导入模版

由于excel具备强大的批量数据处理能力和便捷的操作体验,用excel整理导入文件是最合适的方式。

但用户自己并不清楚导入数据要如何整理导入文件中。因此,我们需要设计一个导入模版,按业务数据表的格式要求,对要导入的数据进行格式规范,确保要导入的数据合法。

1124b265acf78ac07e3e7c171b9c816b.png

员工信息表中“性别”字段的要求是:必填、枚举类型(男、女)。若导入表格中对应列的值出现了空值或“不详”,则数据非法。

导入非法的数据,就会导致业务数据出现错误。

在设计导入模版时,要根据业务的实际情况,梳理出所有的字段,确定每个字段的格式要求,并给出对应的提示信息。具体要求如下:

1. 明确字段格式:关键字段都要有明确的要求,以引导用户准确整理导入文件。如手机号字段必须是11位数字,性别必须是男、女中的一个值;

2. 精确到最小颗粒:导入模版中的每一列,都要精确到最小颗粒,尽量不要将多个字段混在一列中,否则在校验数据时,必须要先拆分单元格的内容,才能对单个数据值进行校验,增加数据校验的复杂度。如省、市、区应该分3列,而不是一列导入;

3. 在表格中给出填写规范提示信息,以减少用户填写错误的概率。

d43432cb153c50db81c1fcb893dc5096.png

在导入数据前,要引导用户下载导入模版,并按模版中的格式要求,整理好需要录入系统的数据。

▋2.明确数据校验规则

2.1导入文件格式校验

数据校验的第一步,是校验导入文件的格式是否正确。如果导入文件格式只支持excel,而用户上传了pdf格式的文件,那导入一定无法完成。

2.2导入文件表头校验

格式校验没问题后,再校验导入文件表头是否与数据表中,需要导入的字段是否匹配。

表头校验的方法是:将导入文件的表头每个字段与数据表需要导入的字段逐一比对,检查同一序号对应列的字段名是否一致。只有导入文件所有字段序号和字段名与数据表完全一致时,导入文件表头校验才匹配。

1124b265acf78ac07e3e7c171b9c816b.png

导入文件中第一列是“手机号”,但数据表第一列是“姓名”,即为不匹配;

导入文件第一列是“手机号”,数据表第一列是“手机号码”,也是不匹配。

数据导入时,系统会按照字段名进行匹配,将导入文件中的数据,写入数据表中对应位置的、同名的字段中。

若不匹配,在数据导入时,导入文件中的数据无法找到对应的数据表字段,从而无法导入。

2.3导入文件字段值校验

表头校验正常后,再对导入文件中具体的字段值做校验,确认其是否合法。

如果不对字段值进行合法性校验,直接导入到数据表中,就有可能导致业务数据错误,甚至引发严重事故。

1124b265acf78ac07e3e7c171b9c816b.png

导入文件中“奖励积分”列的值,本来应该填写奖励的积分数量,但被错误地填入了用户手机号,结果导致每个用户发放了100多亿个积分。

字段值校验的方法是:根据数据表对各个字段值的格式定义,逐个检查导入文件中的对应字段的值是否合法。字段值校验可能会遇到以下不合法的情况:

1. 基本要求不满足:导入模版中有要求值的字符类型、字符长度、业务规则限制,但导入文件就中的值不满足。若强行导入,会导致数据错误。如导入模版要求是11位数字,导入文件的值是中英文的字符;

2. 找不到匹配的值:导入文件中的部分字段的值,要求在已有数据表中存在,但数据表中查不到。若强行导入,会导致该数据找不到对应的归属主体。如导入文件中“用户ID”的值,在用户表中找不到;

3. 与其他字段的值不匹配:某几个字段的值之间有联动关系,但导入文件中的值联动关系错误。若强行导入,会导致对应数据错乱。如导入文件有员工籍贯所在地,分省、市、区3列,若省的值为广东,则该条数据中,市的值必须是广东省的地级市,不允许出现了其他省的市。

数据校验完成后,根据数据校验结果,决定是否导入数据,或导入哪些行的数据。对于所有列的值都合法的数据行,可以直接导入;而数据行的任意一列的值不合法,则该行数据无法导入。

▋3.使用异步方式,快速导入正确数据

在批量录入数据的场景下,用户的核心需求是:快速将数据录入系统。产品方案应该要围绕该核心需求来设计。

3.1 字段值完全正确的数据行,可以直接导入

在执行数据导入前,我们有必要先确定导入文件中,每一行的数据都完全正确吗?其实并不需要。

用户在整理导入文件时,难免会出一些小错误。比如导入文件有100行数据,某1行数据的某个值错误,但剩下的99行数据的值都是正确的。

如果要求所有数据都完全正确,才能被导入,那就会导致完全正确的大部分数据,不能更“及时”地录入系统中,必须要将其中极少数错误的数据修正后,重新检验数据,再尝试导入。

更高效的做法是:导入文件中,字段值完全正确的数据行,可以直接导入,而错误的部分数据行,提供下载功能,让用户修改后,重新导入。

3.2覆盖更新已有数据

在系统导入过程中,若某条数据在系统中已经存在,而导入文件也包含了该条数据,此时应该如何处理?

在产品的角度看,通常有三种处理方式:

1. 不允许导入。若用户需要更新该条数据,就需要先删除已有数据再重新导入,或到系统中修改;

2. 询问用户是否要覆盖已有数据。系统要找出已存在的数据,标记两者之间的差异,用户选择是否要更新后,自动执行;

3. 直接覆盖已有数据。用户无需做任何处理。

很明显,第3种处理方式的用户操作成本及研发成本都是更低的。

1124b265acf78ac07e3e7c171b9c816b.png

导入5月份的考试成绩时,通过学号查询,发现张三的成绩已经导入过了。此时,将根据导入数据,更新张三的成绩。

采用这种方式,默认了需要导入的数据,比系统中已存在的数据更及时、更准确。因此,我们必须要用户:若检测到导入数据在数据表中已存在,则更新该条数据。

3.3 系统异步处理

如果需要导入的数据量大,且系统性能不足,系统就要花费较长的时间来处理。在等待系统处理完成期间,用户想关掉导入页面,去做其他操作,怎么办?

从研发的角度看,系统处理数据,通常有同步和异步两种方式。

所谓的同步,指发起请求后,后端必须立即响应,处理完成时返回结果。而异步,指的是发起请求后,后端会先接收请求,并在“自己”方便的时候进行处理,处理完成后,再返回结果。

如果使用同步方式,就会导致用户等待时间过长,甚至最后可能因为超时而导入失败,给用户带来极大的负面感受。而使用异步方式导入,用户上传文件后,即可关闭导入窗口,放心地去做其他操作,且不会因超时而导入失败。

异步导入,既避免用户浪费时间等待,又降低了导入失败的概率,用户体验明显更好。

▋4.显示导入结果,引导下载导入失败数据

数据导入完成后,需显示导入结果,告知用户导入成功了多少、失败了多少。

对于导入失败的数据,提供下载导入失败数据的入口,并在导出文件中标记出不正确的值。这样,用户可以在修正后,重新导入。

批量导入方案的优点

上文描述的批量导入方案,不仅能满足用户批量录入数据的需求,还能低成本地复用到其他功能模块。

使用异步的方式来导入,用户将导入文件上传到系统后,即可放心地去做别的工作,数据导入完成后,再来查看导入结果。大幅度提升了数据录入效率。

当另一个功能模块也需要用到数据导入功能时,只需要修改导入模版和字段值校验规则,即完成产品方案设计和开发。有效提升了产品方案输出和功能开发的效率,降低人力成本。

总结

批量数据导入能快速将数据录入系统,降低企业的人力成本。在设计产品方案时,应该在确保导入性能足够的条件下,避免用户等待,并降低产品和研发的人力成本,提高用户和产品研发团队的工作效率。

12dc9037fa717d1a9ba55a3314ea22a6.png

0c4c4eb8e9a819086f6409128a0c66b0.png

70e2e7863b00774bab43c811b35710a9.png

5年产品经理

专注后台产品方向

长按扫码加好友

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google C++单元测试框架(Gtest)系列教程之一——入门

引言 本文将先介绍单元测试的相关概念,然后引入Google的开源C单元测试框架Gtest,最后通过编译、运行Gtest自带的一个测试样例,介绍如何在Unix/Linux下使用Gtest。 单元测试 说到单元测试,大家应该不会陌生。作为软件开发过程…

luoguP3185 [HNOI2007]分裂游戏 枚举 + 博弈论

每个位置的瓶子中的每个石子是一个独立的游戏 只要计算出他们的\(sg\)值即可 至于方案数&#xff0c;反正不多\(n^3\)暴力枚举即可 反正怎么暴力都能过啊 复杂度\(O(Tn^3)\) #include <cstdio> #include <cstring> #include <iostream> #include <algorit…

opencv图像前景目标提取

1、功能 论文图片处理需要用到简单的前景目标提取&#xff0c;这里采用opencv的grabCut函数&#xff1b; 前期可以采用selectROI获取矩形框&#xff08;需要添加contrib库&#xff09;&#xff0c;也可以手动设定rect&#xff1b; 添加了一个图片批处理操作&#xff0c;glob函数…

内存结构 堆 栈 全局区 常量区 代码区

转载&#xff1a;https://blog.csdn.net/levy1021/article/details/45419381

批量提交 kafka_Kafka精华问答|kafka的使用场景是什么?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。作为一种高吞吐量的分布式发布订阅消息系统&#xff0c;有着诸多特性。今天&#xff0c;就让我们一起来看看关于它的精华问答吧&#xff01;1Q&a…

Gtest在vs 2010上的配置

找了好多文章&#xff0c;发现这篇是讲得最简便、正确的&#xff01; 以下为复制&粘贴的&#xff1a; [cpp] view plaincopyVS2010 gtest简易配置 使用一个简单的控制台来演示。 1.下载google test http://code.google.com/p/googletest/downloads/detail?nameg…

Python集合list,tuple,dict,set

Python四中集合list&#xff0c;tuple&#xff0c;dict&#xff0c;set list(有数组越界问题) 创建list&#xff1a;L [Michael, 100, True] 访问list&#xff1a;L[0] 倒序访问&#xff1a;L[-1] 添加新元素&#xff1a;L.append(paul)或者L.insert(0,paul) 删除元素与&#…

jmeter性能分析_使用JMeter和Yourkit进行REST / HTTP服务的性能分析

jmeter性能分析我的上一篇文章描述了如何使用JMeter完成异步REST / HTTP服务的压力测试或负载测试。 但是&#xff0c;运行这样的测试通常表明被测系统不能很好地应对增加的负载。 现在的问题是如何找到瓶颈&#xff1f; 深入研究代码以检测可疑部分可能是一种替代方法。 但是…

JAVA错误:无法从静态上下文中引用非静态变量 this

新学习&#xff1a;构造方法的重载&#xff0c;给成员变量赋值 错误代码&#xff1a; class Student {public static void main(String[] args) {Person p new Person();p.setAge(24);p.setName("杨洋");p.show();System.out.println("Hello World!");}…

datetime建立索引有用吗_超全的数据库建表、SQL、索引规范

背景因为工作岗位的原因&#xff0c;负责制定了关于后端组数据库的规约规范&#xff0c;作为所有产品线的规范&#xff0c;历经几版的修改&#xff0c;最终形成下边的文本&#xff0c;规范在整个后端执行也有大半年的时间&#xff0c;对于整个团队在开发阶段就减少不恰当的建表…

linux找不到动态链接库 .so文件的解决方法

如果使用自己手动生成的动态链接库.so文件&#xff0c;但是这个.so文件&#xff0c;没有加入库文件搜索路劲中&#xff0c;程序运行时可能会出现找不到动态链接库的情形。 可以通过ldd命名来查看可执行文件依赖的动态链接库&#xff0c;如下(其中D为可执行程序)&#xff1a; 其…

mui的学习图片预览

css部分 <link href"./css/mui.min.css" rel"stylesheet"/> <style> html,body {margin: 0px;padding: 0px;background-color: white;} .mui-preview-image.mui-fullscreen { position: fixed;z-index: 20; background-co…

Kafka Connect在MapR上

在本周的白板演练中&#xff0c;MapR的高级产品营销经理Ankur Desai描述了Apache Kafka Connect和REST API如何简化和提高在处理来自包括旧数据库或数据仓库在内的各种数据源的流数据时的敏捷性。 他还解释了使用MapR Streams与Kafka进行数据传输时此体系结构的差异。 其他资源…

LeetCode--palindrome-number回文数

1、问题 Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of u…

如何取消 登录_LSAT | 退考、缺考、取消成绩,各自的区别和流程是怎样的?

专注顶尖法学院JD/LLM申请指导咨询&#xff0c;更多内容请关注联才微信公众号&#xff1a;wisdom-linked排版 | 联才; 编辑 | 联才掐指一算&#xff0c;现在距离6/23亚洲场LSAT考试只剩下15天的时间了&#xff0c;你目前的备考进展如何呢&#xff1f;如果你拿不准是否要去考试&…

gtest 编译、安装和使用

本例以 gtest-1.7.0 为例进行讲解。一、要求&#xff1a;1. 安装 cmake二、编译1. 下载 gtest 源码包&#xff0c;并解压&#xff0c;如&#xff1a;/home/hdc/gtest-1.7.0&#xff1b; 2. 编译 gtest 动态库&#xff0c;进入 gtest-1.7.0 目录&#xff0c;编辑 CMakeLists.tx…

ReentrantReadWriteLock读写锁的使用

类ReentrantLock具有完全互斥排他的效果&#xff0c;即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性&#xff0c;但是效率低下。JDK提供了ReentrantReadWriteLock读写锁&#xff0c;使用它可以加快效率&#xff0c;在某些不需要操作…

idea如何把包变为模块_让我们将包变成模块系统!

idea如何把包变为模块使用构建系统将许多项目分为模块/子项目&#xff08; Maven &#xff0c; Gradle &#xff0c; SBT …&#xff09;&#xff1b; 编写模块化代码通常是一件好事。 将代码分为构建模块主要用于&#xff1a; 隔离代码部分&#xff08;减少耦合&#xff09; …

VS2017无法启动

新安装了VS2017&#xff0c;安装没问题&#xff0c;但是总出现启动时没反应的状况&#xff0c;鼠标双击后转圈&#xff0c;然后就没然后了。。 解决办法&#xff1a; 第一步&#xff1a; 开始-->所有程序-->Microsoft Visual Studio 2017文件夹-->VisualStudio Tool…

gm怎么刷东西 rust_Rust语言:解引用详述,搞不明白这个概念,趁早放弃Rust

Rust是内存安全的&#xff0c;对新手来说&#xff0c;最大的困难是可恶的编译器&#xff0c;在其他语言上面叱咤风云&#xff0c;偏偏被Rust搞到崩溃。所以&#xff0c;大家都戏谑道&#xff0c;Rust是面向编译器编程。和编译器做斗争的过程中&#xff0c;遇到最多的是&#xf…