临时要处理一堆BOM相关的问题,但是一个个核对效率太慢,所以打算用Python写个小脚本解决这个问题。2910974669

问题背景

某机型的全配BOM的层级是一个多级递进和回归的表格,表格示意如下

层级 料号 类型 名称
0 xxx xxxx xxx
1 xx xxx xxx

层级间的递进关系如图所示图像

要解决的问题和要达到的目的

为了便于在物料处理过程中能够快速的反查底层物料影响哪一些模块,因此打算把数据导入到Access数据库,并用Parent ID的关系把他们串起来,便于反查。

因此就想简单的用Python写两个脚本来实现这个功能,其中比较难处理的就是前面说的这部分的处理。

因此对处理过程做一个记录,本文只对物料多层级关联处理这一部分。

用到的工具

  • Python 3.7
  • xlrd – 用来读取Excel数据
  • Visual Studio Code – Python IDE

处理过程

这个问题的处理有两部分:

  1. 正向读取数据的后的物料之间的关联,这个比较简单,只需要记住上一层及的物料的料号作为父亲料号即可;
  2. 回溯时候的父亲料号处理:

    • 从低层级物料回溯到高层级物料的处理,要使用高层级物料已经记录的父亲节点料号;
    • 从回溯后的高层级物料分解是,要使用临近高层级的物料作为父亲物料

    因此这里是处理的重点。

    总结

    要处理这个问题,主要要用到的知识点是:

    1. Python 对Excel的处理,这里主要用到了读取的操作,比较简单,可以执行搜索;
    2. Python的字典,由于我没有用递归算法,递归在这里也不是很实用,所以我用到了字典来处理,字典就是‘键-值’对;
    3. 对于已经出现过的层级,记录在字典中,当搜索进行到下一层级时,取上一级作为父亲节点;
    4. 当回溯时,从字典中取出已经存在的父亲节点的料号,即可完成处理。

    处理的示例代码

xlrd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import xlwt

dict = {0:""}

pre_level=0
pre_id=""
cur_level=0
cur_id=""

parent_id=""
data = xlrd.open_workbook("/Volumes/Doc/code/test.xls")

table = data.sheets()[0] #通过索引顺序获取
print(table.nrows)

print("-------------current--------------")
for i in range(0,table.nrows):
rvalue = table.row_values(i)
cur_level = rvalue[0]
cur_id = rvalue[1]
print("curleve:%d, curid:%s"%(cur_level,cur_id))
if cur_level > pre_level:
dict[cur_level]=pre_id
parent_id = dict[cur_level]
pre_level = cur_level
pre_id = cur_id
print("Current Level:%d, Current ID:%s, Parent ID:%s"%(cur_level,cur_id,parent_id))
print("-------------current--------------")

print("Dict")
for key in dict:
print("key:%d, value:%s" %(key,dict[key]))