横断面地面线数据反推平距高程并导入 Excel 指定格式,这个需求在公路、铁路、水利、市政等勘察设计项目中非常常见。外业测量拿到的横断面原始数据,往往是一串连续的平距和高程,或者是从 CAD 横断面图上提取出来的散点坐标,而内业成图、土方计算、断面复核又要求把数据整理成固定的 Excel 表格格式。手动反推平距高程、一个一个点复制粘贴,断面一多就非常痛苦。这篇文章直接给出可落地的处理思路和 Python 脚本,帮助你把横断面地面线数据批量反推成平距-高程序列,并按照指定格式写入 Excel。
先看这个需求的几个关键点:第一,原始数据格式不统一,可能是“里程 平距 高程”连续排列,也可能是“平距:高程”键值对,甚至是从 CAD 图导出的一堆坐标点;第二,目标 Excel 格式往往有固定模板,比如第一列是里程/桩号,后面按“平距、高程、平距、高程”交替排列,或者按“左侧点、右侧点”分区排列;第三,批量处理能力很重要,一个项目几十个断面,手动处理效率太低。这篇文章的核心,就是解决“数据格式解析”和“指定格式写出”这两个问题。
本文会演示以下实操内容:如何用 Python 读取常见的横断面地面线原始数据;如何从坐标点反推相对中桩的平距和高程;如何把解析结果按指定列顺序写入 Excel;如何批量处理多个断面的数据并校验输出结果。如果你是测量员、道路设计师、造价工程师,或者经常和横断面数据打交道的技术员,这篇文章可以直接收藏。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 解决场景 | 横断面地面线原始数据反推平距高程,并整理为 Excel 指定格式 |
| 输入数据 | 平距高程连续序列、坐标点列表、CAD 导出文本等 |
| 输出格式 | Excel(.xlsx),列顺序和表头可自定义 |
| 核心处理 | 数据解析、平距反推、里程分类、格式重排 |
| 支持批量 | 支持批量处理多个断面文件 |
| 运行环境 | Windows / Linux / macOS,安装 Python 3.8+ 即可 |
| 关键技术 | pandas、openpyxl、正则表达式、坐标方位角计算 |
| API 接口 | 无独立 API,可封装为命令行工具或函数库供其他脚本调用 |
| 适合场景 | 断面数据内业整理、土方计算前处理、断面图绘制数据准备 |
从能力看,这个方案不是某个现成软件,而是一套基于 Python 的数据处理流程。优势在于格式解析灵活,能根据实际原始数据调整正则规则和列映射关系;缺点是使用前需要了解基本的 Python 环境和脚本运行方式。
2. 适用场景与使用边界
2.1 适合谁用
公路和铁路勘察设计人员最常用。外业测量队交回来的横断面数据,通常是按“中桩里程、左侧平距、左侧高程、右侧平距、右侧高程”的顺序记录,或者是从全站仪、GNSS-RTK 导出的 CSV 文件。这些数据往往夹杂表头说明、空行、中文备注,直接用 Excel 打开后格式乱七八糟,需要先清洗再重排。
水利和市政工程技术人员也适用。河道断面、管道纵断面、道路边线放样等场景,数据结构和横断面类似,都可以用同一套解析逻辑处理。
造价和土方计算人员同样能用。方格网法、断面法土方计算前,需要把断面数据整理成指定的 Excel 模板。用脚本预处理,可以省掉大量手工操作。
2.2 能解决什么问题
一是解决格式不统一的问题。不同测量组、不同仪器导出的数据格式不同,脚本通过正则表达式和分隔符识别,把数据统一解析为“平距、高程”点对。
二是解决坐标反推的问题。有的原始数据是绝对坐标(X、Y、Z),需要结合中桩坐标才能算出相对中桩的平距和高程。脚本内置了坐标反算逻辑,能够从坐标点计算偏距。
三是解决批量处理的问题。几十个断面文件放在同一个目录下,脚本循环读取、解析、写出,一分钟内完成全部整理工作。
2.3 不适合什么场景
如果原始数据本身就是规范的 Excel 表格,列顺序已经是“平距、高程”交替排列,那用 Excel 自带的公式或者 Power Query 就能处理,没必要写 Python 脚本。如果断面数量很少、只有三五个,手动整理反而更快。
如果需要处理的是三维断面、含超欠挖标记、带地质分层信息的复杂断面,这套基础脚本需要扩展改造,不能直接套用。
2.4 安全与合规边界
横断面数据通常来自工程项目测量成果,涉及工程坐标、地形信息,具有一定敏感性。处理数据时应注意:只使用已授权可用的项目数据;不在公共网络传输包含精确坐标的原始文件;输出成果用于项目内业计算时,必须经过专业复核;不得使用本方法伪造或篡改测量数据,工程测量成果应依据相关规范进行质量控制。
3. 环境准备与前置条件
3.1 操作系统
Windows 10/11、Linux、macOS 均可。本文演示以 Windows 为主,命令在 Linux/macOS 下需要把python替换为python3,路径分隔符也需要相应调整。
3.2 安装 Python
需要 Python 3.8 或更高版本。如果电脑还没有安装 Python,到 Python 官网下载安装包,安装时勾选“Add Python to PATH”,这样命令行才能直接识别python命令。
安装完成后,打开命令行工具(Windows 下是 CMD 或 PowerShell,也可以直接用 VS Code 的终端),输入以下命令验证版本:
python --version能输出版本号,说明 Python 环境正常。
3.3 安装依赖库
主要使用三个库:pandas负责表格数据处理和 Excel 写出,openpyxl是 pandas 写 .xlsx 文件的后端引擎,numpy用于坐标计算。安装命令如下:
pip install pandas openpyxl numpy建议在虚拟环境中安装,避免污染全局 Python 环境。创建并激活虚拟环境:
python -m venv section_envWindows 下激活:
section_env\Scripts\activateLinux/macOS 下激活:
source section_env/bin/activate激活后,命令行提示符前面会出现(section_env),此时再执行 pip 安装。
3.4 磁盘与文件准备
磁盘空间需求很小,Python 环境加依赖库约占用 500MB 左右,实测数据处理脚本本身不到 100KB。需要准备一个输入目录和一个输出目录,建议结构如下:
project/ ├── input/ # 存放原始断面数据文件 ├── output/ # 存放整理后的 Excel 文件 ├── script.py # 数据处理脚本 └── template.xlsx # 如果需要按模板格式输出,放置模板文件3.5 端口与网络
这是一个本地数据处理脚本,不涉及端口监听和 Web 服务,不需要考虑端口冲突问题。如果你的网络环境不允许直接使用pip install,需要配置国内镜像源,例如:
pip install pandas openpyxl numpy -i https://pypi.tuna.tsinghua.edu.cn/simple4. 安装部署与数据处理脚本
4.1 脚本整体思路
先判断数据格式。常见横断面原始数据有以下几种:
第一种:一行一个点,每行包含“平距 高程”两个数字,文件名或文件内备注标明里程。
0.000 45.32 -5.000 46.10 -10.000 47.25 5.000 44.98 10.000 43.65这里的负号表示左侧,正号表示右侧。
第二种:一行包含多个点,整行数据是“平距1 高程1 平距2 高程2 ...”的连续序列。
0.000 45.32 -5.000 46.10 -10.000 47.25 5.000 44.98 10.000 43.65第三种:数据包含坐标点(X、Y、Z),需要根据中桩坐标反推平距和高程。
第四种:数据格式比较自由,例如“K1+050 左5.2 高46.1 右3.4 高45.8”这类带文字描述的行。
脚本的核心是写两个函数:parse_section_data负责把不同格式的原始数据解析成统一结构;write_to_excel_template负责把解析后的数据按指定格式写入 Excel。
4.2 基础脚本示例
下面给出一个可直接复制的 Python 脚本。脚本支持“一行多个平距高程点”和“一行一个点”两种常见格式,并将结果写入 Excel。
import os import re import pandas as pd from pathlib import Path INPUT_DIR = Path("./input") OUTPUT_DIR = Path("./output") OUTPUT_DIR.mkdir(exist_ok=True) def parse_numbers_from_line(line: str): """ 从一行文本中提取所有数字。 支持负数、小数、科学计数法。 """ pattern = r"-?\d+\.?\d*(?:[eE][+-]?\d+)?" numbers = re.findall(pattern, line) return [float(x) for x in numbers] def parse_section_file(file_path: Path): """ 解析单个横断面文件。 返回一个字典:{"mileage": 里程, "points": [(平距, 高程), ...]} 里程从文件名或文件内容中提取。 """ with open(file_path, "r", encoding="utf-8-sig") as f: lines = f.readlines() points = [] mileage = None for line in lines: line = line.strip() if not line: continue # 尝试提取里程信息 if mileage is None: m = re.search(r"K?\d+\+?\d*\.?\d*", line) if m: mileage_text = m.group(0) # 将 K1+050 转换为 1050 mileage_text = mileage_text.replace("K", "").replace("+", "") try: mileage = float(mileage_text) except ValueError: pass numbers = parse_numbers_from_line(line) # 如果一行只有两个数,当作“平距 高程”一对 if len(numbers) == 2: points.append((numbers[0], numbers[1])) # 如果一行有多个数,按“平距 高程”成对解析 elif len(numbers) >= 4: for i in range(0, len(numbers) - 1, 2): points.append((numbers[i], numbers[i + 1])) # 去重并按照平距排序 points = sorted(set(points), key=lambda x: x[0]) if mileage is None: mileage = file_path.stem return {"mileage": mileage, "points": points} def batch_process(input_dir: Path, output_dir: Path): """ 批量处理 input_dir 下的所有 txt/csv 文件, 将每个断面写入 output_dir 下的一个 Excel 文件。 """ files = list(input_dir.glob("*.txt")) + list(input_dir.glob("*.csv")) if not files: print("未找到任何 txt 或 csv 文件") return for file_path in files: print(f"正在处理: {file_path.name}") result = parse_section_file(file_path) mileage = result["mileage"] points = result["points"] if not points: print(f"警告: {file_path.name} 未解析出有效点,跳过") continue # 构造 DataFrame df = pd.DataFrame(points, columns=["平距", "高程"]) # 输出文件名 output_file = output_dir / f"{file_path.stem}_整理.xlsx" with pd.ExcelWriter(output_file, engine="openpyxl") as writer: df.to_excel(writer, sheet_name=f"K{mileage}", index=False) print(f"已输出: {output_file}") if __name__ == "__main__": batch_process(INPUT_DIR, OUTPUT_DIR)这个脚本的逻辑比较直观:先用正则表达式从每行提取数字,然后判断一行是一个点还是多个点,最后写入 Excel。需要注意,parse_numbers_from_line会忽略文字,所以“左”“右”“高”等汉字不会影响解析。但“K1+050”这类里程信息会被当作数字提取出来,脚本里加了单独的里程提取逻辑,避免里程混入点数据。
4.3 按指定模板格式输出
很多项目有固定的 Excel 模板,比如:
| 桩号 | 左侧平距 | 左侧高程 | 右侧平距 | 右侧高程 |
|---|---|---|---|---|
| K1+050 | -10.000 | 47.25 | 5.000 | 44.98 |
| -5.000 | 46.10 | 10.000 | 43.65 |
这种格式的特点是左侧和右侧分开放,基数行是桩号,后续行留空。要生成这种格式,需要对解析后的点做左右分区,再转置写入。参考下面这个函数:
def write_multi_row_template(df, output_file, mileage): """ 将平距-高程数据按左右分区写入指定模板。 """ left_points = df[df["平距"] < 0].copy() right_points = df[df["平距"] >= 0].copy() left_points["平距"] = left_points["平距"].abs() left_points = left_points.sort_values("平距", ascending=False) right_points = right_points.sort_values("平距", ascending=True) max_len = max(len(left_points), len(right_points)) # 构造模板数据 rows = [] for i in range(max_len): row = {} if i == 0: row["桩号"] = f"K{mileage}" else: row["桩号"] = "" if i < len(left_points): row["左侧平距"] = left_points.iloc[i]["平距"] row["左侧高程"] = left_points.iloc[i]["高程"] else: row["左侧平距"] = "" row["左侧高程"] = "" if i < len(right_points): row["右侧平距"] = right_points.iloc[i]["平距"] row["右侧高程"] = right_points.iloc[i]["高程"] else: row["右侧平距"] = "" row["右侧高程"] = "" rows.append(row) df_template = pd.DataFrame(rows, columns=["桩号", "左侧平距", "左侧高程", "右侧平距", "右侧高程"]) df_template.to_excel(output_file, index=False)从模板生成的列名可以看出,这种格式适合从断面中线向两侧逐点排列,便于直接作图或导入专业软件。
5. 功能测试与效果验证
5.1 测试数据准备
新建一个input目录,先放两个测试文件。
第一个文件K1+050.txt,内容如下:
横断面地面线数据 中桩里程:K1+050 0.000 45.32 -5.000 46.10 -10.000 47.25 5.000 44.98 10.000 43.65这个文件包含表头文字和一行一个点的数据,用来验证文字过滤和数字提取。
第二个文件K1+100.txt,内容如下:
0.000 44.10 -4.500 44.80 -9.200 46.00 4.300 43.90 8.700 42.60这个文件一行包含多个点,用来验证成对解析逻辑。
5.2 运行脚本
把上一节的脚本保存为section_tool.py,放在项目根目录。打开命令行,切换到项目目录,运行:
python section_tool.py正常输出如下:
正在处理: K1+050.txt 已输出: output\K1+050_整理.xlsx 正在处理: K1+100.txt 已输出: output\K1+100_整理.xlsx5.3 验证输出格式
打开output/K1+050_整理.xlsx,可以看到 sheet 名称为K1050.0,数据为两列:平距和高程,共 5 行。
关键验证点:
- 表头是否被正确过滤:文件里的“横断面地面线数据”“中桩里程”等文字不应出现在数据中。
- 点位个数是否正确:K1+050 有 5 个点,K1+100 有 5 个点。
- 平距排序是否符合预期:脚本里做了
sorted(set(points)),所以平距从小到大排列,重复点会被去重。 - 里程是否从文字中提取成功:sheet 名称如果显示
K1050.0说明提取成功。
5.4 失败排查
如果运行脚本后没有生成 Excel,检查以下几点:
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 提示“未找到任何 txt 或 csv 文件” | input 目录不存在或文件后缀不对 | 检查项目根目录下是否有 input 文件夹 | 新建 input 目录,确认文件是 .txt 或 .csv |
| 解析出 0 个点 | 文件编码不是 UTF-8 | 用记事本打开文件,另存为 UTF-8 编码 | 将编码转换为 utf-8-sig 后再运行 |
| 数字提取错误,里程混入点数 | 正则表达式匹配到了注释文字中的数字 | 打印中间结果,检查 parse_numbers_from_line 输出 | 增加过滤逻辑,跳过包含里程关键字的行 |
| 输出的点位顺序不是距离顺序 | 原始文件中点顺序混乱 | 查看原始文件排列方式 | 脚本已默认排序,确认排序方向是否符合需求 |
| Excel 打开报格式错误 | pandas 与 openpyxl 版本不一致 | 查看依赖版本 | 升级 openpyxl 到最新版 |
6. 批量处理与进阶数据格式支持
6.1 批量文件目录处理
实际项目中,每个断面通常是一个独立文件,文件名可能包含里程信息,例如K1+050.txt、K1+100.txt、K2+350.txt。上面的batch_process函数已经支持按目录批量处理,把几十个文件全部放入input目录,运行一次脚本即可全部输出。
如果想把所有断面整理到同一个 Excel 的不同 sheet 中,只需要调整batch_process函数,把所有 DataFrame 收集到一个 list,最后统一写入一个 Excel 文件。参考写法:
def batch_process_single_excel(input_dir: Path, output_file: Path): files = list(input_dir.glob("*.txt")) + list(input_dir.glob("*.csv")) with pd.ExcelWriter(output_file, engine="openpyxl") as writer: for file_path in files: result = parse_section_file(file_path) df = pd.DataFrame(result["points"], columns=["平距", "高程"]) # sheet 名称不能超过 31 个字符,不能包含特殊字符 sheet_name = f"K{result['mileage']}" sheet_name = sheet_name.replace(".", "_") df.to_excel(writer, sheet_name=sheet_name[:31], index=False) print(f"已写入: {file_path.name} -> {sheet_name}")注意 Excel 的 sheet 名称限制:不能为空、不能超过 31 个字符、不能包含\ / ? * [ ] :等字符。里程如果转换成浮点数,可能包含小数点,需要用replace(".", "_")处理。
6.2 绝对坐标反推平距高程
如果原始数据是三维坐标(X、Y、Z),并且已知中桩坐标(X0、Y0、Z0)和中桩方位角 A,那么可以根据坐标几何关系反推平距和高程。计算公式如下:
平距 = 该点到路线中线的垂直距离,有正负之分,左侧为负、右侧为正。
计算公式:
dx = X - X0 dy = Y - Y0 横向偏移 = -dx * sin(A) + dy * cos(A) # 右侧为正,左侧为负 纵向偏移 = dx * cos(A) + dy * sin(A) # 沿路线方向 平距 = 横向偏移 高程 = Z用 Python 实现如下:
import math def coordinate_to_offset(x, y, z, x0, y0, z0, azimuth_deg): """ 根据中桩坐标和方位角,将绝对坐标转换为平距和高程。 azimuth_deg: 中桩方位角,单位度,正北为0,顺时针增加。 """ dx = x - x0 dy = y - y0 az_rad = math.radians(azimuth_deg) # 横向偏移:右侧为正,左侧为负 offset = -dx * math.sin(az_rad) + dy * math.cos(az_rad) # 纵向偏移:沿路线方向前进为正 forward = dx * math.cos(az_rad) + dy * math.sin(az_rad) height = z - z0 # 如果需要相对高差,减去中桩高程;如果需要绝对高程,直接用 z return offset, height如果数据来自 CAD 横断面图,提取出的坐标点通常是断面线节点坐标,需要先确定中桩点在断面线上的位置,然后以该点为原点计算各节点的相对平距。实际项目中,也可以先手动在 CAD 中查询中桩坐标和方位角,再批量计算。
6.3 CSV 文件分隔符兼容
从测量仪器导出的 CSV 文件,分隔符可能是逗号、制表符或分号。parse_numbers_from_line使用的是正则提取数字,不依赖分隔符,所以天然兼容多种分隔符。但如果数据文件是 GBK/GB2312 编码,open()时需要使用正确的编码,比如:
with open(file_path, "r", encoding="gbk", errors="ignore") as f:一般建议先统一转成 UTF-8 编码再处理,避免跨平台时出现编码问题。
6.4 命令行参数化
上面的脚本写死了输入目录和输出目录。更灵活的方式是使用argparse支持命令行参数,方便批量调用和集成到其他工具链:
import argparse def main(): parser = argparse.ArgumentParser(description="横断面地面线数据反推平距高程并导入Excel") parser.add_argument("--input", default="./input", help="输入目录") parser.add_argument("--output", default="./output", help="输出目录") parser.add_argument("--mode", choices=["separate", "single"], default="separate", help="separate:每个断面输出一个Excel; single:所有断面写入一个Excel") args = parser.parse_args() input_dir = Path(args.input) output_dir = Path(args.output) output_dir.mkdir(exist_ok=True) if args.mode == "separate": batch_process(input_dir, output_dir) else: output_file = output_dir / "全部断面数据.xlsx" batch_process_single_excel(input_dir, output_file) if __name__ == "__main__": main()这样运行方式就变成:
python section_tool.py --input ./data/raw --output ./data/result --mode single7. 数据处理效率与运行性能
7.1 数据量对性能的影响
横断面单条断面线的地面线点数通常在 10 到 100 之间。一个中等规模的公路项目可能有 200 到 500 个断面,总数据量约 1 万到 5 万个点。这个量级对 pandas 来说是极小数据,处理时间基本在几秒以内。
运行效率主要瓶颈不在数据处理,而在 Excel 文件写入。每个断面写一个独立 Excel 文件时,pd.ExcelWriter每次创建一个新工作簿,如果文件数量很多,建议使用“全部断面写入单个 Excel”的模式,减少文件打开关闭的开销。
7.2 内存占用
虽然 pandas 对大数据处理很擅长,但这里的数据量根本不需要考虑内存问题。一个包含 5 万个点的 DataFrame 只占用几十 MB 内存,普通办公电脑完全无压力。如果你用的是 8GB 内存的机器,放心跑。
7.3 如何验证处理结果
处理完成后,建议用以下方式验收:
- 抽查 3 到 5 个断面,手工推算其中 1 到 2 个点的平距高程与脚本输出对比。
- 检查 Excel 表头是否与项目模板一致。
- 检查平距排序方向是否满足后续绘图软件的导入要求。
- 检查是否存在重复点或明显异常高程。
- 如果有坐标反推,选择一个点手工计算验证方位角和偏移公式是否正确。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 数据解析后点数比原始数据少 | 正则表达式漏掉某些负号或科学计数法 | 打印解析后的点列表,和原始文件对比 | 调整正则表达式,兼容+1.23E-05等格式 |
| 高程列出现乱码或错位 | 文件编码不是 UTF-8 | 用文本编辑器查看原始文件编码 | 统一转成 UTF-8 或读取时指定 encoding="gbk" |
| 平距全部变成正数 | 正负号被字符串提取时遗漏 | 检查parse_numbers_from_line是否保留负号 | 正则表达式开头增加-? |
| 第一列桩号显示为小数 | 里程字符串中+号处理不彻底 | 检查里程提取逻辑 | 去掉里程字符串中所有非数字字符后转数字 |
| 输出 Excel 打不开 | openpyxl 版本异常或文件被占用 | 重新安装 openpyxl,关闭已打开的 Excel | pip install --upgrade openpyxl |
| 批量处理时某个文件报错导致中断 | 单个文件数据格式异常 | 在循环中加 try...except 并打印文件名 | 增加异常捕获,跳过问题文件并记录日志 |
| 坐标反推的结果方向反了 | 方位角计算习惯不一致 | 用一个已知点验证正负号 | 调整公式中的 sin/cos 符号 |
8.1 异常捕获示例
批量处理时最好加异常捕获,避免一个文件出错导致整个任务中断:
for file_path in files: try: result = parse_section_file(file_path) # 后续处理... except Exception as e: print(f"处理 {file_path.name} 时出错: {e}") continue9. 最佳实践与使用建议
9.1 先小后大,先单后批
第一次使用脚本时,不要直接跑全部文件。先放一个测试文件,确认解析结果正确、Excel 格式符合要求,再批量处理。这样能减少格式调整阶段返工的时间。
9.2 保留原始数据,输出到独立目录
原始测量文件不要覆盖。脚本输出到独立目录,建议按“输入日期_处理批次”命名输出文件夹,方便追溯。
9.3 建立最小可运行配置
把脚本、测试文件、依赖清单(requirements.txt)放在同一个目录,形成一套可复用的工作包。下次项目直接复制,不需要重新调试。
pip freeze > requirements.txt下次部署时:
pip install -r requirements.txt9.4 对输出结果做双重校验
脚本不是测量成果的最终依据。整理后的 Excel 必须由测量或设计人员复核,特别是里程、平距正负号、高程异常值。建议在脚本中增加简单的逻辑校验:
def validate_points(points): """校验点数据合理性""" for distance, height in points: if abs(distance) > 100: print(f"警告: 平距 {distance} 超出常见范围,请复核") if height < -100 or height > 10000: print(f"警告: 高程 {height} 可能异常,请复核")9.5 接口与自动化集成
虽然不是独立的 API 服务,但脚本中的函数可以直接被其他 Python 程序调用。比如,你可以在土方计算软件的数据预处理阶段,把本脚本封装为一个数据清洗模块,在数据进入计算流程前自动完成格式转换。
如果需要在 Windows 计划任务中定时运行,可以把命令写入 .bat 文件:
@echo off cd /d D:\projects\section_tool call section_env\Scripts\activate python section_tool.py --input .\data\raw --output .\data\result --mode single pause9.6 关于数据合规
横断面数据涉及工程地形信息,处理后的输出文件同样需要按照项目数据管理规定保存和传播。涉及第三方工程数据时,确保有合法的数据使用授权。
10. 总结与下一步
横断面地面线数据反推平距高程导入 Excel 指定格式,本质上是一个数据解析和格式重排问题。难点不在写入 Excel,而在原始数据格式的多样性。文章给出的正则解析方案能兼容大多数纯文本格式,坐标反推公式能处理绝对坐标数据,批量处理逻辑能应对几十个断面的项目。
最先应该验证的功能,是用一个已知格式的测试文件跑通整个流程,确认平距正负号、高程精度和 Excel 列顺序是否符合项目模板。最容易踩的坑有两个:一个是编码问题,GBK 编码的 txt 文件直接在 UTF-8 模式下读取会乱码;另一个是正则表达式漏掉负号,导致左侧平距全部变成正数。
后续可以扩展的方向包括:接入更多输入格式、支持按断面里程自动排序、增加异常数据可视化标记、对接土方计算软件的专用数据接口。如果你经常处理这类数据,可以先把这套脚本整理成自己的“断面数据工具箱”,以后新项目直接复用,效率提升会非常明显。