鱼C论坛

 找回密码
 立即注册
查看: 750|回复: 2

行列录入后储存问题

[复制链接]
发表于 2024-2-3 10:12:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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 [list(map(convert, left_elements)), list(map(convert, right_elements))]

# 示例
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[sheet_name] = {'rows': row_validations, 'cols': col_validations},

    储存是这样的样式: {'sheet1': {'rows': [(5, [6, 15, 30, 37])], 'cols': [(4, [5, 6, 7, 8])]}, 'sheet2': {'rows': [(4, [5, 10, 15, 20])], 'cols': [(4, [5, 6, 7, 8, 41])]}}。

储存的结果与sheet名一一对应,以便后续遇到同名的sheet时自动调用。

请问如何实现?

回复请注意python格式。

          

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[sheet_name] = {}
    
    # 保存行验证规则和列验证规则
    if 'rows' not in sheet_validations[sheet_name]:
        sheet_validations[sheet_name]['rows'] = []
    if 'cols' not in sheet_validations[sheet_name]:
        sheet_validations[sheet_name]['cols'] = []

    sheet_validations[sheet_name]['rows'].append(tuple(row_rule))
    if col_rule:
        sheet_validations[sheet_name]['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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[sheet_name] = {}
    # 保存行验证规则和列验证规则
    if 'rows' not in sheet_validations[sheet_name]:
        sheet_validations[sheet_name]['rows'] = []
    if 'cols' not in sheet_validations[sheet_name]:
        sheet_validations[sheet_name]['cols'] = []
    sheet_validations[sheet_name]['rows'].append(tuple(row_rule))
    if col_rule:
        sheet_validations[sheet_name]['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名,都会自动调用之前保存的验证规则。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 04:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表