行列录入后储存问题
前贴有大佬回复我的问题如下:2.1 多条行/列验证规则的识别和存储
对于用户输入的形如“3+5+6=7+16+31+38”或者“M+N+O+P+Q+R=S+T+U+V+W+X+Y”这样的验证规则,我们需要将其分解成左边和右边的两个部分,再进一步分解成单独的数字或字母。这可以通过字符串分割和映射实现。
def parse_validation_rule(rule):
# 分割等号两侧
left_side, right_side = rule.split('=')
# 分割左侧和右侧的元素
left_elements = left_side.split('+')
right_elements = right_side.split('+')
# 将字母转换为列号,数字保持不变
def convert(element):
if element.isalpha():
# 将列字母转换为列号(例如A -> 0, B -> 1)
return ord(element.upper()) - ord('A')
else:
# 将字符串数字转换为整数
return int(element) - 1# 减1是因为Excel行列是从1开始的
return
# 示例
print(parse_validation_rule("3+5+6=7+16+31+38"))
print(parse_validation_rule("M+N+O+P+Q+R=S+T+U+V+W+X+Y"))
由此我提出如下新的问题:
1.这样的话,用户可能同时录入行规则(数字形式)和列规则(大写字母形式),能否多加一个条件对录入情形自动识别、分开保存为”行规则“和”列规则“呢?
2.针对每一个工作簿中的每一个sheet,行验证规则和列验证的储存样式是:sheet_validations = {'rows': row_validations, 'cols': col_validations},
储存是这样的样式: {'sheet1': {'rows': [(5, )], 'cols': [(4, )]}, 'sheet2': {'rows': [(4, )], 'cols': [(4, )]}}。
储存的结果与sheet名一一对应,以便后续遇到同名的sheet时自动调用。
请问如何实现?
回复请注意python格式。
1. 对于用户同时输入的行规则和列规则,可以通过判断录入的规则中是否含有数字和大写字母来进行区分。具体实现如下:
def parse_validation_rule(rule):
if any(char.isdigit() for char in rule) and any(char.isupper() for char in rule):
# 同时包含数字和大写字母,判断为既有行规则又有列规则
row_rule = ''
col_rule = ''
# 将行规则和列规则分开保存
for char in rule:
if char.isdigit():
row_rule += char
elif char.isupper():
col_rule += char
# 返回行规则和列规则
return row_rule, col_rule
else:
# 只有行规则或只有列规则
return rule, None
# 示例
print(parse_validation_rule("3+5+6=7+16+31+38"))# ('3+5+6=7+16+31+38', None)
print(parse_validation_rule("M+N+O+P+Q+R=S+T+U+V+W+X+Y"))# ('MNOPQRSTUVWXYZ', 'STUVWXYZ')
2. 针对每一个工作簿中的每一个sheet,可以使用一个嵌套字典来保存验证规则。其中外层字典的键是sheet名,值是内层字典;内层字典的键是'rows'和'cols',值是对应的行验证规则和列验证规则列表。具体实现如下:
sheet_validations = {}
def save_validation_rule(sheet_name, row_rule, col_rule):
# 如果sheet名不存在,则添加一个新的字典
if sheet_name not in sheet_validations:
sheet_validations = {}
# 保存行验证规则和列验证规则
if 'rows' not in sheet_validations:
sheet_validations['rows'] = []
if 'cols' not in sheet_validations:
sheet_validations['cols'] = []
sheet_validations['rows'].append(tuple(row_rule))
if col_rule:
sheet_validations['cols'].append(tuple(col_rule))
# 示例
save_validation_rule('sheet1', '3+5+6=7+16+31+38', None)
save_validation_rule('sheet2', '4', '4')
print(sheet_validations)# {'sheet1': {'rows': [('3+5+6=7+16+31+38',)], 'cols': [()]}, 'sheet2': {'rows': [('4',)], 'cols': [('4',)]}}
这样,对于每个相同的sheet名,都会自动调用之前保存的验证规则。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 对于问题1,可以通过判断录入的规则中是否含有数字和大写字母来进行区分。具体实现如下:
def parse_validation_rule(rule):
if any(char.isdigit() for char in rule) and any(char.isupper() for char in rule):
# 同时包含数字和大写字母,判断为既有行规则又有列规则
row_rule = ''
col_rule = ''
# 将行规则和列规则分开保存
for char in rule:
if char.isdigit():
row_rule += char
elif char.isupper():
col_rule += char
# 返回行规则和列规则
return row_rule, col_rule
else:
# 只有行规则或只有列规则
return rule, None
# 示例
print(parse_validation_rule("3+5+6=7+16+31+38"))# ('356', None)
print(parse_validation_rule("M+N+O+P+Q+R=S+T+U+V+W+X+Y"))# ('MNOPQRSTUVWXYZ', 'STUVWXYZ')
对于问题2,可以使用一个嵌套字典来保存验证规则。其中外层字典的键是sheet名,值是内层字典;内层字典的键是’rows’和’cols’,值是对应的行验证规则和列验证规则列表。具体实现如下:
sheet_validations = {}
def save_validation_rule(sheet_name, row_rule, col_rule):
# 如果sheet名不存在,则添加一个新的字典
if sheet_name not in sheet_validations:
sheet_validations = {}
# 保存行验证规则和列验证规则
if 'rows' not in sheet_validations:
sheet_validations['rows'] = []
if 'cols' not in sheet_validations:
sheet_validations['cols'] = []
sheet_validations['rows'].append(tuple(row_rule))
if col_rule:
sheet_validations['cols'].append(tuple(col_rule))
# 示例
save_validation_rule('sheet1', '356', None)
save_validation_rule('sheet2', '4', '4')
print(sheet_validations)# {'sheet1': {'rows': [('356',)], 'cols': [()]}, 'sheet2': {'rows': [('4',)], 'cols': [('4',)]}}
AI 生成的代码。仔细查看和使用。 有关常见问题解答的详细信息.
这样,对于每个相同的sheet名,都会自动调用之前保存的验证规则。
页:
[1]