论坛元老
- 威望
- 2358
- 贡献
- 1409
- 热心值
- 0
- 金币
- 1919
- 注册时间
- 2023-9-14
|
解决问题点
拿到一个产品的BOM,有许多位号对应的原材料品番。
买材料的时候需要一个材料对应几个位号,但是生产核对的时候核对的是位号对应的品番,下面实现的好几种位号的BOM,拆分成一个位号对应一个品番,方便核对。
处理之前
品番 | 使用数量 | 位号 | 品番1 | 11 | C357,370,374-376,383-385,387-389 | 品番2 | 11 | C14,15,131,221-223,235-237,241,242 | 品番3 | 9 | C12,13,88,90,92,96,100,103,104 | 品番4 | 8 | C111,112,115,117,119,121,122,130 | 品番5 | 11 | C132,218-220,230-234,245,246 | 品番6 | 48 | C257-280,290-304,307-310,317-321 |
处理之后
品番 | 使用数量 | 位号 | 品番1 | 11 | C357 | 品番1 | 11 | C370 | 品番1 | 11 | C374 | 品番1 | 11 | C375 | 品番1 | 11 | C376 | 品番1 | 11 | C383 | 品番1 | 11 | C384 | 品番1 | 11 | C385 | 品番1 | 11 | C387 | 品番1 | 11 | C388 | 品番1 | 11 | C389 | 品番2 | 11 | C14 | 品番2 | 11 | C15 | 品番2 | 11 | C131 | 品番2 | 11 | C221 | 品番2 | 11 | C222 | 品番2 | 11 | C223 | 品番2 | 11 | C235 | 品番2 | 11 | C236 | 品番2 | 11 | C237 | 品番2 | 11 | C241 | 品番2 | 11 | C242 | 品番3 | 9 | C12 | 品番3 | 9 | C13 | 品番3 | 9 | C88 | 品番3 | 9 | C90 | 品番3 | 9 | C92 | 品番3 | 9 | C96 | 品番3 | 9 | C100 | 品番3 | 9 | C103 | 品番3 | 9 | C104 | 品番4 | 8 | C111 | 品番4 | 8 | C112 | 品番4 | 8 | C115 | 品番4 | 8 | C117 | 品番4 | 8 | C119 | 品番4 | 8 | C121 | 品番4 | 8 | C122 | 品番4 | 8 | C130 | 品番5 | 11 | C132 | 品番5 | 11 | C218 | 品番5 | 11 | C219 | 品番5 | 11 | C220 | 品番5 | 11 | C230 | 品番5 | 11 | C231 | 品番5 | 11 | C232 | 品番5 | 11 | C233 | 品番5 | 11 | C234 | 品番5 | 11 | C245 | 品番5 | 11 | C246 | 品番6 | 48 | C257 | 品番6 | 48 | C258 | 品番6 | 48 | C259 | 品番6 | 48 | C260 | 品番6 | 48 | C261 | 品番6 | 48 | C262 | 品番6 | 48 | C263 | 品番6 | 48 | C264 | 品番6 | 48 | C265 | 品番6 | 48 | C266 | 品番6 | 48 | C267 | 品番6 | 48 | C268 | 品番6 | 48 | C269 | 品番6 | 48 | C270 | 品番6 | 48 | C271 | 品番6 | 48 | C272 | 品番6 | 48 | C273 | 品番6 | 48 | C274 | 品番6 | 48 | C275 | 品番6 | 48 | C276 | 品番6 | 48 | C277 | 品番6 | 48 | C278 | 品番6 | 48 | C279 | 品番6 | 48 | C280 | 品番6 | 48 | C290 | 品番6 | 48 | C291 | 品番6 | 48 | C292 | 品番6 | 48 | C293 | 品番6 | 48 | C294 | 品番6 | 48 | C295 | 品番6 | 48 | C296 | 品番6 | 48 | C297 | 品番6 | 48 | C298 | 品番6 | 48 | C299 | 品番6 | 48 | C300 | 品番6 | 48 | C301 | 品番6 | 48 | C302 | 品番6 | 48 | C303 | 品番6 | 48 | C304 | 品番6 | 48 | C307 | 品番6 | 48 | C308 | 品番6 | 48 | C309 | 品番6 | 48 | C310 | 品番6 | 48 | C317 | 品番6 | 48 | C318 | 品番6 | 48 | C319 | 品番6 | 48 | C320 | 品番6 | 48 | C321 |
如果大家觉得使用,可以点赞收藏,不好用也希望提下改善建议。
测试运行环境:
python版本 :python 3.7
IDE:Pycharm2022.1.1
模块使用:os,re,openpyxl,tkinter
源码:初次发表,源码如下:
# -*- coding:utf-8 -*-
"""
# @File : excel数据拆分.py
# @Author:chen
# @Date : 2024/1/5
# @Desc :
"""
import re
import os
from tkinter import filedialog
from openpyxl import load_workbook
# 定义文件夹路径
# folder_path = os.path.dirname(os.path.abspath(__file__))
data_dir = filedialog.askdirectory(title='请选择文件夹') + '/'
# 列出文件夹中的所有文件和文件夹
files = os.listdir(data_dir)
# 遍历文件列表,筛选出文件名
file_names = [file for file in files if os.path.isfile(os.path.join(data_dir, file))]
print("需要处理的文件名:", file_names)
def parse(data):
list1 = []
if ',' in data[2]:
list2 = data[2].split(',')
# print(list2)
# print("*"*90)
list1 = [i for i in list2 if i is not '']
# print(list1)
elif ' ' in data[2]:
list2 = data[2].split(' ')
# print(list2)
# print("*"*90)
list1 = [i for i in list2 if i is not '']
else:
list1 = [data[2]]
# print(list1)
# 针对第一个字母的多个回路改进 C300-335,350-405,407,268-275,520
# 问题点 回路没有字母的需要判断一下
new_list = []
first_id = list1[0]
if first_id.isdigit(): # 判断回路是不是纯数字组成
first_id_str = ''
else:
first_id_str = re.findall(r'[a-zA-Z]+', first_id)[0]
# 添加代替品
pa = ''
if len(data) >= 4:
pa = data[3]
for i in list1:
if '-' in i:
print("带-或空格的回路开始分解")
item = i.split('-')
item_start = item[0]
item_end = item[-1]
item_str = re.findall(r'[a-zA-Z]+', item_start)
if item_str:
item_str = item_str[0]
else:
item_str = first_id_str
data_num = re.findall(r"\d+", item_start)
item_start_num = int(data_num[0])
item_end_num = int(re.findall(r"\d+", item_end)[0])
for a in range(item_start_num, item_end_num + 1):
c = item_str + str(a)
new_list.append([data[0], data[1], c, pa])
# print(item_str,item_start_num,item_end_num)
else:
if i.isdigit():
c = first_id_str + i
new_list.append([data[0], data[1], c, pa])
else:
new_list.append([data[0], data[1], i, pa])
print(new_list)
return new_list
def parse_data():
for name in file_names:
print(name)
if '.xls' in name:
wb = load_workbook(data_dir + name)
# print(data_dir+name)
sheet = wb.active
sheet_data = []
for rows in sheet:
row_list = []
for cell in rows:
row_list.append(cell.value)
sheet_data.append(row_list)
# print(sheet_data)
new_sheet_data = []
for items in sheet_data:
if items[2] == None:
continue
data = items[2]
if ',' in data or '-' in data or " " in data:
new_list = parse(items)
for parse_list in new_list:
new_sheet_data.append(parse_list)
# print(new_list)
else:
new_sheet_data.append(items)
# print(new_sheet_data)
sheet2 = wb.create_sheet("new_sheet")
print("创建新的sheet完成,sheet名:new_sheet")
for d in new_sheet_data:
if isinstance(d, list):
sheet2.append(d)
else:
print(d, "格式不对-->", type(d))
wb.save(data_dir + name)
wb.close()
print("分解完成")
if __name__ == '__main__':
parse_data()
|
|