批量记录格式化需求:连续数值合并及行长度限制
嘿,针对你这个十万+条记录的格式化需求,我整理了一套完整的实现方案,结合你给出的四条规则,咱们一步步来搞定:
批量处理十万+记录列表的格式化方案
核心规则拆解
先把需求拆解清楚,确保每个细节都覆盖到位:
- 规则1:连续数值合并为「起始-结束」形式,非连续数值用逗号分隔(比如
1,2,3,5会被处理成1-3,5) - 规则2:每行开头固定添加「11111」
- 规则3:每行内容长度最大为80字符
- 规则4:数值内容严格位于第21至80列,且每行末尾必须以逗号结尾
实现思路与Python代码示例
因为要处理十万+条记录,得保证效率和内存友好,用Python来实现是个靠谱的选择,下面是完整的逻辑代码:
第一步:合并连续数值
先写一个高效的连续数值合并函数,遍历一次列表就能完成,时间复杂度O(n),完全适配大数据量:
def merge_continuous_numbers(num_list): if not num_list: return [] merged = [] start = end = num_list[0] for num in num_list[1:]: if num == end + 1: end = num else: merged.append(f"{start}-{end}" if start != end else f"{start}") start = end = num # 处理最后一组未添加的序列 merged.append(f"{start}-{end}" if start != end else f"{start}") return merged
第二步:生成符合格式要求的行
接下来处理行的格式:开头加「11111」后补空格到第20列,再填充数值内容,严格控制每行长度不超过80,且数值部分末尾加逗号:
def format_records(num_list): merged_items = merge_continuous_numbers(num_list) result_lines = [] # 前缀:「11111」+15个空格,刚好占满前20列 prefix = "11111" + " " * 15 current_line_content = [] for item in merged_items: # 模拟添加当前item后的数值内容长度(含末尾逗号) temp_content = ",".join(current_line_content + [item]) + "," # 数值部分最大允许60字符(80-20=60,对应第21到80列) if len(temp_content) <= 60: current_line_content.append(item) else: # 生成当前行并加入结果 full_line = prefix + ",".join(current_line_content) + "," result_lines.append(full_line) current_line_content = [item] # 处理最后一行剩余的内容 if current_line_content: full_line = prefix + ",".join(current_line_content) + "," result_lines.append(full_line) return result_lines
测试示例
假设输入数据是:[1,2,3,5,6,8,10,11,12,13]
调用函数测试:
input_nums = [1,2,3,5,6,8,10,11,12,13] output_lines = format_records(input_nums) for line in output_lines: print(line)
期望输出(前20列是「11111」加空格,数值从第21列开始):
11111 1-3,5-6,8,10-13,
如果合并后的数值内容过长,会自动拆分多行,比如合并内容是1-100,102-200,202-300,302-400,402-500,会拆成两行:
11111 1-100,102-200,202-300,302-400, 11111 402-500,
注意事项
- 如果输入的数值是字符串类型,记得先转换成整数再处理连续合并,避免出现
"10"和"11"被误判为非连续的情况 - 处理十万+条记录时,建议分批读取输入数据(比如从文件按行读取),避免一次性加载所有数据占用过多内存
- 可以用
len(line)验证每行长度,确保严格不超过80字符,数值部分完全落在第21-80列
内容的提问来源于stack exchange,提问作者OXXO
相关产品推荐
相关产品推荐

