把名字按字拆分,然后判断是否存在重复

CREATE TABLE #T
(
    名字 VARCHAR(10)
)
 
INSERT INTO #T VALUES('汤晶1晶'),('张三丰'),('欧阳兰兰'),('孙悟空')
 
--把名字按字拆分,然后判断是否存在重复
SELECT * FROM #T WHERE EXISTS
(  
    SELECT * FROM
    (
    SELECT SUBSTRING(名字,number,1) AS V
        FROM master..spt_values WHERE type='P' AND number BETWEEN 1 AND LEN(名字)
    ) A
    GROUP BY V HAVING COUNT(1)>1
  )


 
drop  table #T

 

请给我写一个Python处理数据的工具: 输入Excel格式如下 DAG_ID subFrmNo JobTypeID JobID JobId_glb Kernel名字 Job负载 JobPL2大小(B) PublishJob Qos Signal minReadyTime maxDoneDeley maxDoneTime coreType CT 申请SL2的buffId Buff大小(KB) 释放SL2的buffId 0 3 J481 0 0 MNGFRM_DEV_KERNEL_ID_PREPROC 13810 520 J176 11 -3 0 DSP 0 0 3 J481 0 1 MNGFRM_DEV_KERNEL_ID_PREPROC 13810 520 J176 11 -3 0 DSP 0 0 3 J176 2 2 PUSCH_DEV_KERNEL_MNGPUSCHPROC 114292 42744 J240 9 -2.5 650000 DSP 0 0 3 J176 2 3 PUSCH_DEV_KERNEL_MNGPUSCHPROC 114292 42744 J240 9 -2.5 650000 DSP 0 0 3 J240 4 4 PUSCH_DEV_KERNEL_USER_MERGE 13383 31504 J178 8 DSP 0 0 3 J240 4 5 PUSCH_DEV_KERNEL_USER_MERGE 13383 31504 J178 8 DSP 0 0 3 J178 6 6 PUSCH_DEV_KERNEL_PARAGEN_PUSCH 26330 26320 J247 7 DSP 0 0 3 J178 6 7 PUSCH_DEV_KERNEL_PARAGEN_PUSCH 26330 26320 J247 7 DSP 0 0 3 J247 8 8 PUSCH_DEV_KERNEL_USERGRP_SLICE_PREPROC 28069 38848 J241 15 -0.5 3250000 DSP 0 0 3 J241 9 9 PUSCH_DEV_KERNEL_USERGRP_SLICE 35323 36212 J252 15 DSP 0 0 3 J252 10 10 PUSCH_DEV_KERNEL_TRIG_USERGRP_PARAGEN 21643 8 J242 10 DSP 0 0 3 J242 11 11 PUSCH_DEV_KERNEL_USERGRP_PARAGEN 53977 33444 J187 10 DSP 0 1 12 0 3 J187 12 12 PUSCH_DEV_KERNEL_TRIGGRAPH 16077 11528 J188 8 DSP 0 0 3 J188 13 13 PUSCH_DEV_KERNEL_GRAPHRESAPPLY 58867 40700 J189 8 0 3900000 DSP 0 2;3;5;6;7;8;9 1;17;3;3;2;1;4 0 3 J189 14 14 PUSCH_DEV_KERNEL_GRAPHSPECSUBMIT 13275 528 J190;J218 8 DSP 0 0 3 J190 15 15 PUSCH_DEV_KERNEL_GRAPHSPEC 21845 14308 J60;J110 8 DSP 0 0 3 J218 16 16 PUSCH_KERNEL_ID_PARAPARSE 15079 16220 J219 7 DSP 0 23;24;25;26;28 1;16;9;1;1 主频F=1300000 用python转化,并且按照如下进行输出数据,给出完整可运行的python代码: task_node【典形式】:元素如下: core_type:来源于 coreType Qos:来源于Qos vproc:来源于 Job负载 mem_apply_list:申请内存的大小,列表形式,申请SL2的buffId为空,则为[0] mem_release_list:释放内存的大小,列表形式,释放SL2的buffId为空,则为[0] minStartTime:来源于 minReadyTime,为空则设置为0, maxEndTime:来源于 maxDoneTime,为空则设置为最大值 DagId:来源于 DAG_ID job_type:#实际为JobTypeId,来源于 JobID dagStartTime:所归属的Dag的空口时间,来源于 subFrmNo*F 计算逻辑 申请SL2的buffId,给的输入是申请的buffId,每个buffId在【Buff大小(KB)】给出 mem_apply_list来源于根据【申请SL2的buffId】得到的申请内存大小的列表 mem_release_list 来源于根据【释放SL2的buffId】得到的申请内存大小的列表,需要等到处理完所有的【申请SL2的buffId】,然后用释放的SL2的buffId去匹配申请的SL2的buffId,得到释放内存的大小 Task_List {key: JobId_glb, value: task_node}
最新发布
03-18
<think>嗯,用户需要我帮忙写一个Python工具来处理他们的Excel数据,转换成特定的典结构。首先,我得仔细看看他们提供的输入格式和输出要求。输入Excel有很多列,比如DAG_ID、subFrmNo、JobTypeID、JobID_glb等等。输出的task_node需要包含core_type、Qos、vproc等段,其中mem_apply_list和mem_release_list需要根据申请和释放的buffId来获取对应的Buff大小。 首先,我得处理申请和释放的buffId。申请SL2的buffId可能包含多个,用分号分隔,对应的Buff大小在另一列。需要将这些buffId拆分成列表,然后根据每个id找到对应的Buff大小。如果申请为空,mem_apply_list就是[0]。这一步可能需要先建立一个buff_id到大小的映射,比如遍历所有行,收集申请过的buffId和对应的Buff大小,这样在处理释放的时候才能找到对应的值。 接下来处理释放SL2的buffId,同样可能有多个,但释放的时候需要根据之前申请的buffId来找到对应的Buff大小。这里可能需要两个典:一个记录所有已申请的buffId及其大小,另一个记录释放的buffId列表,然后根据释放的id从申请典中取值。如果释放的id在申请中不存在,可能需要处理异常情况,但用户可能假设数据是正确对应的,所以暂时不考虑错误处理。 然后处理其他段,比如coreType直接取,Qos转换为数值,vproc是Job负载。minStartTime如果为空设为0,maxEndTime为空设为最大值。DagId来自DAG_ID,job_type来自JobTypeID,dagStartTime是subFrmNo乘以主频F=1300000。 需要注意数据类型转换的问题,比如符串中的分号分隔符需要拆分成列表,然后查找对应的Buff大小。例如,申请SL2的buffId列中的“2;3;5;6;7;8;9”需要拆成['2','3','5','6','7','8','9'],然后在Buff大小列中找到对应的每个id的大小,可能Buff大小列是“1;17;3;3;2;1;4”,需要一一对应。这里可能需要将这两个列拆分成列表,然后逐个对应,形成buff_id到size的映射。 另外,同一个JobId_glb可能有多个行,但根据示例数据,每个JobId_glb是唯一的,所以可以直接用JobId_glb作为key。 在代码实现上,可能需要用pandas读取Excel,然后逐行处理。首先遍历所有行,构建申请buff的映射,可能需要一个全局的典来保存所有申请过的buffId和对应的size。但注意到每个行的“申请SL2的buffId”和“Buff大小(KB)”可能不同,比如某一行申请了buffId1,另一行申请了同样的id但不同的大小,这会不会有问题?根据用户的数据,例如JobId_glb=12的行,申请buffId是1,对应的Buff大小是12。而JobId_glb=14的行,申请buffId是2;3;5;6;7;8;9,对应的Buff大小是1;17;3;3;2;1;4。看起来每个申请行的buffId和Buff大小是一一对应的,所以每个申请行中的buffId和对应的Buff大小是同一行内的数据。因此,在构建申请映射时,可能需要将每个行的申请buffId和对应的Buff大小组合起来,合并到一个全局的典中。但需要确认是否同一buffId在不同行中的大小可能不同,如果是的话可能会有冲突,但用户的数据中可能假设每个buffId在全局唯一,或者在申请时同一id的大小一致。例如,在示例数据中,JobId_glb=12的申请buffId是1,Buff大小是12,而其他行是否有同样的id?比如JobId_glb=14的释放buffId中有23;24;25;26;28,对应的Buff大小是1;16;9;1;1。可能每个申请的buffId在全局是唯一的,或者每个行的申请buffId是该行独有的。所以可能需要将每个行的申请buffId和对应的Buff大小合并到一个全局的典中,覆盖已有的项,或者作为累积。但根据用户的需求描述,可能需要将每个申请行的buffId和对应的Buff大小记录下来,当处理释放的时候,根据这些已申请的id来查找。例如,释放的buffId可能是在之前某一行申请的。所以正确的做法应该是,在处理所有行的申请时,收集所有申请过的buffId和对应的Buff大小,形成一个全局的映射。这样,当处理释放的时候,可以在这个全局映射中查找对应的size。 因此,处理步骤可能分为两个阶段:首先遍历所有行,收集所有申请过的buffId和对应的Buff大小,构建全局的buff_id_to_size典。然后再次遍历所有行,处理每个任务的mem_apply_list和mem_release_list,其中释放的buffId需要从全局的buff_id_to_size中获取size。 这样,代码的大致流程是: 1. 读取Excel文件,使用pandas的read_excel。 2. 构建buff_id到size的映射: - 遍历每一行,如果“申请SL2的buffId”不为空,拆分成列表,对应的“Buff大小(KB)”拆分成列表,然后逐个对应,将buff_id和size存入buff_id_to_size典。 3. 再次遍历每一行,处理每个任务节点: - 处理申请:拆分申请buffId,如果为空则[0],否则根据每个id从buff_id_to_size中找size,组成mem_apply_list。 - 处理释放:拆分释放buffId,如果为空则[0],否则根据每个id从buff_id_to_size中找size,组成mem_release_list。 - 处理其他段,如core_type、Qos等。 - 构造task_node典,并添加到Task_List中,以JobId_glb为key。 但需要注意,申请和释放的buffId可能在同一行处理,例如某个任务申请了buffId,另一个任务释放它。因此,必须先处理所有申请,再处理释放,所以需要先收集所有申请的buffId,然后在处理每个任务的释放时使用这个全局映射。 这样,代码的结构应该是: - 读取数据到DataFrame。 - 初始化buff_id_to_size = {}。 - 遍历每一行,处理申请SL2的buffId和Buff大小: - 如果申请buffId非空,拆分得到id列表,Buff大小拆分为size列表。 - 遍历每个id和对应的size,将id作为键,size作为值存入buff_id_to_size。注意,如果同一个id多次出现,后面的会覆盖前面的?或者用户的数据是否存在这种情况?根据用户的数据,例如JobId_glb=12的申请buffId是1,对应Buff大小12。假设每个buffId在全局唯一,否则可能会有冲突。但用户的数据可能存在重复的申请,比如不同的任务申请相同的buffId?但根据应用场景,可能buffId是唯一的,所以每个申请只出现一次,或者用户的数据可能有误,但代码需要处理这种情况,可能取最后一次出现的大小。 根据用户的数据,比如第一行的申请buffId为空,而后面某些行有申请。例如,JobId_glb=12的行,申请buffId是1,对应的Buff大小是12。另一行JobId_glb=14的申请buffId是2;3;5;6;7;8;9,对应的Buff大小是1;17;3;3;2;1;4。所以每个申请行的buffId是该行独有的,不会重复。这样,全局的buff_id_to_size典可以安全地收集所有申请的buffId和对应的size。 然后,在处理释放的时候,比如某行的释放buffId是某个id,就可以从buff_id_to_size中找到对应的size。 现在,具体到代码实现: 读取Excel可以使用pandas,例如: import pandas as pd df = pd.read_excel('input.xlsx') 然后,构建buff_id_to_size: buff_id_to_size = {} for idx, row in df.iterrows(): apply_buff_ids = str(row['申请SL2的buffId']).strip() buff_sizes = str(row['Buff大小(KB)']).strip() if apply_buff_ids and apply_buff_ids != 'nan': # 处理非空情况 ids = apply_buff_ids.split(';') sizes = buff_sizes.split(';') if buff_sizes else [] # 检查长度是否匹配 if len(ids) != len(sizes): # 可能需要处理错误,但用户数据可能正确,这里假设长度一致 pass # 或者抛出警告 for id, size in zip(ids, sizes): buff_id_to_size[id.strip()] = int(size) # 转换为整数 这里需要注意,原数据中的申请SL2的buffId和Buff大小可能包含空格,需要strip处理。另外,pandas读取空单元格可能会变成NaN,所以用str()转换,并检查是否为'nan'符串。 接下来,处理每个任务节点: task_list = {} for idx, row in df.iterrows(): job_id_glb = str(row['JobId_glb']).strip() # core_type core_type = row['coreType'] # Qos,可能为空? qos = row['Qos'] if pd.isna(qos): qos = 0 # 根据需求处理空值,但示例中Qos有数值,可能不存在空? # vproc是Job负载 vproc = row['Job负载'] # mem_apply_list apply_buff_ids = str(row['申请SL2的buffId']).strip() if not apply_buff_ids or apply_buff_ids == 'nan': mem_apply = [0] else: ids = apply_buff_ids.split(';') mem_apply = [buff_id_to_size.get(id.strip(), 0) for id in ids] # 如果找不到,设为0? # mem_release_list release_buff_ids = str(row['释放SL2的buffId']).strip() if not release_buff_ids or release_buff_ids == 'nan': mem_release = [0] else: ids = release_buff_ids.split(';') mem_release = [buff_id_to_size.get(id.strip(), 0) for id in ids] # minStartTime,minReadyTime,空则0 min_start = row['minReadyTime'] if pd.isna(min_start): min_start = 0 else: min_start = int(min_start) # maxEndTime,maxDoneTime,空则设为最大值,假设是某个大数,比如float('inf') max_end = row['maxDoneTime'] if pd.isna(max_end): max_end = float('inf') else: max_end = int(max_end) # DagId dag_id = row['DAG_ID'] # job_type是JobTypeID,来源于JobID? # 用户说明:job_type实际为JobTypeId,来源于JobID。但原数据列是JobTypeID? # 原数据列有JobTypeID和JobID,用户可能写错了? # 例如输入Excel列有JobTypeID,而用户说明说job_type来源于JobID? # 需要仔细看用户的问题描述: # 用户说“job_type:#实际为JobTypeId,来源于 JobID”,可能有矛盾? # 原Excel列有JobTypeID和JobID两列,比如示例数据中的JobTypeID是J481,J176等,而JobID是0,2,4等。 # 根据用户的问题描述,job_type应该取JobTypeID的值。例如,用户可能打错了,正确应该是来源于JobTypeID列? # 根据用户的指示: # job_type:#实际为JobTypeId,来源于 JobID # 这里可能存在疑问,因为原数据中JobID是数,而JobTypeID是像J481这样的符串。例如,用户示例数据中的JobTypeID是J481,而JobID是0,2等。 # 可能用户描述有误,正确的应该是job_type来源于JobTypeID列,而可能用户写成了JobID。或者需要进一步确认。 # 例如,用户提供的输入数据列包括JobTypeID和JobID,例如第一行的JobTypeID是J481,JobID是0。用户要求job_type是实际为JobTypeId,来源于JobID。这可能有矛盾,因为JobID是数值,而JobTypeID是符串。或者用户可能希望job_type是JobTypeID列的值? # 这里可能需要用户澄清,但根据示例数据,比如在输出中,每个task_node的job_type应该是像J481这样的值,而JobID列是0,1,2等,所以更可能的是用户希望job_type取自JobTypeID列,而可能描述中的“来源于 JobID”是笔误。 # 所以,这里可能需要将job_type设置为row['JobTypeID'] job_type = row['JobTypeID'] # dagStartTime是subFrmNo * F sub_frm_no = row['subFrmNo'] f = 1300000 dag_start_time = sub_frm_no * f # 构造task_node task_node = { 'core_type': core_type, 'Qos': qos, 'vproc': vproc, 'mem_apply_list': mem_apply, 'mem_release_list': mem_release, 'minStartTime': min_start, 'maxEndTime': max_end, 'DagId': dag_id, 'job_type': job_type, 'dagStartTime': dag_start_time } task_list[job_id_glb] = task_node 这里有几个需要注意的地方: 1. JobTypeID和JobID的混淆:用户可能写错了,需要根据数据判断。例如,示例中的JobTypeID是像J481这样的符串,而JobID是数。而用户要求job_type是JobTypeId,来源于JobID。这可能矛盾,所以可能需要确认。如果用户确实希望job_type来自JobID列(即数值),那代码应该取row['JobID']。但根据常规命名,JobTypeID可能更合理。例如,用户的数据中,同一JobTypeID可能对应多个JobID。例如,DAG_ID=3,subFrmNo=3,JobTypeID=J481对应的JobID是0,而另一个JobTypeID=J176对应的JobID是2。这可能表示不同的任务类型。所以,用户可能希望job_type是JobTypeID的值,即符串类型,而不是JobID的数值。因此,可能用户的描述有误,正确来源是JobTypeID列。所以代码中应取row['JobTypeID']。 2. 处理Qos的空值:在示例数据中,Qos列有数值,如11、9、8等,但某些行可能为空?需要检查是否有空值,并按照用户要求处理。如果Qos为空,可能设为0或者保持原样?用户示例中的Qos列没有空值,所以可能该列在输入数据中总是有值。 3. 主频F=1300000,用户给出,直接使用。 4. maxEndTime为空则设置为最大值,这里用float('inf')表示,但实际应用中可能需要根据具体情况调整,比如用一个大整数。 5. 在拆分申请和释放的buffId时,需要注意原数据中的空值,比如用pandas读取时,空单元格可能变成NaN,所以用str()转换后得到'nan'符串,需要处理这种情况。 此外,关于释放SL2的buffId的处理,用户说明中提到需要等到处理完所有的申请,然后用释放的id去匹配申请的id,得到对应的size。所以,在代码中必须先处理所有行的申请,构建buff_id_to_size典,然后再处理释放的部分。这在代码中已经通过先遍历所有行收集申请,再处理释放来实现。 最后,将task_list输出为典形式,其中key是JobId_glb,value是task_node。 现在,将这些步骤整合成一个完整的Python代码,并测试是否可行。需要确保pandas正确安装,并且Excel文件路径正确。 总结代码步骤: 1. 导入pandas。 2. 读取Excel数据。 3. 构建buff_id到size的映射。 4. 遍历每一行,处理每个任务节点,填充task_list。 5. 输出task_list。 可能还需要处理数据类型转换的问题,比如Job负载、Buff大小等列是否都是整数。在示例数据中,这些列看起来是整数,所以转换时可能需要int()处理。 现在,根据以上分析,编写代码。</think>以下是根据需求编写的Python数据处理工具代码,包含详细注释: ```python import pandas as pd def process_excel_data(file_path): # 读取Excel数据 df = pd.read_excel(file_path) # 构建全局buff_id到buff_size的映射 buff_id_to_size = {} for idx, row in df.iterrows(): apply_buff_ids = str(row["申请SL2的buffId"]).strip() buff_sizes = str(row["Buff大小(KB)"]).strip() if apply_buff_ids not in ["", "nan"] and buff_sizes not in ["", "nan"]: ids = [x.strip() for x in apply_buff_ids.split(";")] sizes = [int(x.strip()) for x in buff_sizes.split(";")] # 确保ID和大小数量一致 if len(ids) == len(sizes): for buff_id, size in zip(ids, sizes): buff_id_to_size[buff_id] = size # 处理每行生成task_node task_list = {} F = 1300000 # 主频 for idx, row in df.iterrows(): # 基础段处理 job_id_glb = str(row["JobId_glb"]) core_type = row["coreType"] qos = float(row["Qos"]) if not pd.isna(row["Qos"]) else 0.0 vproc = int(row["Job负载"]) dag_id = int(row["DAG_ID"]) job_type = row["JobTypeID"] # 根据数据观察应为JobTypeID列 # 内存申请列表处理 apply_buff_ids = str(row["申请SL2的buffId"]).strip() if apply_buff_ids in ["", "nan"]: mem_apply = [0] else: mem_apply = [buff_id_to_size.get(x.strip(), 0) for x in apply_buff_ids.split(";")] # 内存释放列表处理 release_buff_ids = str(row["释放SL2的buffId"]).strip() if release_buff_ids in ["", "nan"]: mem_release = [0] else: mem_release = [buff_id_to_size.get(x.strip(), 0) for x in release_buff_ids.split(";")] # 时间相关处理 min_start = int(row["minReadyTime"]) if not pd.isna(row["minReadyTime"]) else 0 max_end = int(row["maxDoneTime"]) if not pd.isna(row["maxDoneTime"]) else float("inf") dag_start = int(row["subFrmNo"]) * F # 构建task_node典 task_node = { "core_type": core_type, "Qos": qos, "vproc": vproc, "mem_apply_list": mem_apply, "mem_release_list": mem_release, "minStartTime": min_start, "maxEndTime": max_end, "DagId": dag_id, "job_type": job_type, "dagStartTime": dag_start } task_list[job_id_glb] = task_node return task_list # 使用示例 if __name__ == "__main__": task_dict = process_excel_data("input.xlsx") # 替换实际文件路径 print("Task List:") for job_id, node in task_dict.items(): print(f"{job_id}: {node}") ``` $$核心实现逻辑说明$$ 1. **数据读取**:使用pandas的`read_excel`函数读取输入文件 2. **内存映射构建**: - 遍历所有行记录申请的buffId大小的映射关系 - 处理形如`2;3;5`的段格式,建立全局查找表 3. **节点处理**: - 对每行数据解析17个段 - 特殊处理分号分隔的内存申请/释放段 - 自动处理空值并设置默认值 4. **时间计算**: - 严格按公式$dagStartTime = subFrmNo \times F$计算 - 对未指定时间戳自动设置0或极大值 $$关键注意事项$$ 1. 输入文件需要包含所有指定列 2. 内存申请/释放的ID必须先在"申请SL2的buffId"列出现过 3. 时间段空值会自动处理为: - $minStartTime \rightarrow 0$ - $maxEndTime \rightarrow \infty$ 4. 输出典的key为符串类型的JobId_glb 建议将Excel文件代码放在同一目录,运行时替换`process_excel_data()`中的文件路径即可直接使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值