diff --git a/工具v2/database_tools.py b/工具v2/database_tools.py index 2a05e107..1e2b55d1 100644 --- a/工具v2/database_tools.py +++ b/工具v2/database_tools.py @@ -9,6 +9,11 @@ def ReadTextFile(filepath): #读取文本格式的文件 data = f.read() return data #返回文本格式文件的内容 +def SaveTextFile(data,filepath): #写入文本格式的文件 + with open(filepath,"w",encoding="u8") as f: + f.write(data) + return filepath #返回文件名 + def SortDict(adict): #按字典项顺序排序字典 return dict(sorted(adict.items())) #返回排序后的字典 @@ -313,7 +318,14 @@ def SeperateFirstLine(string): # 切割一个含有换行的字符串 def ObtainDatatoModify(metadatafilepath,fields_dict): #从metadata文件中获取需要修改的综合信息, metadata文件用双回车区分项, 单行的项表示此后的字段, 不小于两行的项中第一行是题目id, 第二行起是要修改的内容. #fieldsdictpath是字段信息数据库文件路径 data = ReadTextFile(metadatafilepath) - data = re.sub(r"\n[\s\n]*\n","\n\n",data) #去除一些无意义的空格和多余的回车 + datalines = data.split("\n") + data = "" + for l in datalines: + if l.strip() in fields_dict: + data += l + "\n\n" + else: + data += l + "\n" + data = re.sub(r"\n[\s\n]*\n","\n\n",data.strip()) #去除一些无意义的空格和多余的回车 datalist = data.split("\n\n") to_modify_list = [] currentfield = "NotAField" @@ -406,6 +418,60 @@ def AppendObjData(prodict,objdict,field_id_and_content): #添加目标编号数 print("已于 %s 的 %s 字段执行添加, 编号为 %s, 内容为 %s"%(id,field,objid,objdict[objid]["content"])) return (id,field,content) #返回三元组: 题号, 字段, 内容 +def AppendUsageData(prodict,field_id_and_content): #添加使用记录数据 + field,id,content = field_id_and_content + lines = [re.sub(r"\s+",r"\t",line.strip()) for line in content.split("\n")] + pending_list = [] + for line in lines: + if not "FORCE" in line.upper(): + time_stripped = re.sub(r"^\d{4,}\t","",line) #读取去除时间的数据 + if time_stripped in "\n".join(prodict[id][field]): + print("题号 %s 的 %s 字段, 内容 %s 已存在"%(id,field,line)) + else: + classid = [info for info in line.split("\t") if len(re.findall(r"[班高一二三]",info))>0][0] # 读取班级号 + if classid in "\n".join(prodict[id][field]): + print("班级 %s 在题号为 %s 的题目处已有使用记录, 在pending list中记录"%(classid,id)) + oldinfo = [usage for usage in prodict[id][field] if classid in usage] + pending_list = pending_list + [(id,line,oldinfo)] + else: + prodict[id][field].append(line) + print("已于 %s 的 %s 字段执行添加, 内容为 %s"%(id,field,line)) + else: + line = re.sub(r"\s+",r"\t",re.sub(r"FORCE","",line.upper())).strip() + prodict[id][field].append(line) + print("已于 %s 的 %s 字段执行强制添加, 内容为 %s"%(id,field,line)) + output = "usages\n\n" + for item in pending_list: + id,new,oldlist = item + output += id + "\n" + output += new+"\tFORCE\n" + output += "\n".join(oldlist)+"\n\n" + return (field,id,content,output) #返回四元组: 题号, 字段, 内容, 待确定是否要添加的字符串(不含FORCE字样的行为旧结果,含FORCE字样的行为新结果,FORCE是运行后强制添加) + +def ModifyMetadata(prodict,objdict,fieldsdict,metadatafilepath,pendingdatafilepath): #metadata自动修改, 根据字段自适应修改, 参数为题库字典, 目标字典, 字段字典, metadata文本文件路径, 待确定是否替换的内容的存放路径 + data_to_modify = ObtainDatatoModify(metadatafilepath,fieldsdict) + for item in data_to_modify: + field = item[0] + if field == "NotAField": + print("字段名有误") + return 1 + else: + method = fieldsdict[field]["Method"] + if method == "overwrite": + feedback = OverwriteData(prodict,fieldsdict,item) + elif method == "append": + feedback = AppendData(prodict,fieldsdict,item) + elif method == "mutualappend": + feedback = AppendMutualData(prodict,item) + elif method == "objappend": + feedback = AppendObjData(prodict,objdict,item) + elif method == "usageappend": + feedback = AppendUsageData(prodict,item) + outputstring = feedback[3] + SaveTextFile(outputstring,pendingdatafilepath) + elif method == "fixed": + print("字段 %s 不可按此方式修改"%field) + return feedback # 已在数据库中修改, 之后需要将数据库写入一次, 返回1表示字段名有误, 返回其他表示成功进行了修改 if __name__ == "__main__": print("数据库工具, import用.") \ No newline at end of file diff --git a/工具v2/修改metadata.py b/工具v2/修改metadata.py new file mode 100644 index 00000000..c02244fa --- /dev/null +++ b/工具v2/修改metadata.py @@ -0,0 +1,17 @@ +metadatafilepath = "文本文件/metadata.txt" +pendingdatafilepath = "临时文件/pendingmetadata.txt" + + + + + + +from database_tools import * + +fieldsdict = load_dict("../题库0.3/ProblemFields.json") +prodict = load_dict("../题库0.3/Problems.json") +objdict = load_dict("../题库0.3/LessonObj.json") + +ModifyMetadata(prodict,objdict,fieldsdict,metadatafilepath,pendingdatafilepath) +save_dict(prodict,"../题库0.3/Problem.json") + diff --git a/工具v2/文本文件/metadata.txt b/工具v2/文本文件/metadata.txt new file mode 100644 index 00000000..0d158334 --- /dev/null +++ b/工具v2/文本文件/metadata.txt @@ -0,0 +1,50 @@ +usages + +000003 +20220825 2023届高三02班 0.909 0.758 +20220825 2023届高三08班 0.929 0.818 +20220825 2023届高三10班 0.963 +20220826 2023届高三11班 0.543 0.213 + +ans +1 +$2$ + +2 +正好 + +objs +123 +K0102001B + +opp +121 +23456 + + +id +000008 +000009 + +origin +12345 +123456 + +unrelated +3 +4 + +unrelated +4 +3 + +tags +5 +哈哈 +六六 + +usages + +000003 +20220825 2023届高三08班 0.929 0.818 FORCE +20220824 2023届高三08班 0.939 0.818 \ No newline at end of file