清風 发表于 2024-2-3 10:12:01

行列录入后储存问题

前贴有大佬回复我的问题如下:

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格式。

          

FishC 发表于 2024-2-3 10:12:29

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 小助理,如未能正确解答您的问题,请继续追问。

学习编程中的Ben 发表于 2024-2-3 11:12:39

对于问题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]
查看完整版本: 行列录入后储存问题