Ok Work 整理出的项目要点想汇总成表 / 先统一字段再写脚本批量归并

文章导读
多个项目的要点文本堆在一起,直接粘进表格经常错行,原因通常不在表格软件,而在于每份文本的分隔符、字段顺序和空行习惯都不一样。可行的顺序是:先把不可见字符显示出来,确认实际用的是哪种分隔符;再定死字段和缺项规则;结构规整的部分先用表格分列跑一遍;重复条目多的部分交给脚本批量归并;最后抽样对照原文并核对行数。这套流程不依赖任何官方导出接口,只要能拿到原始文本就能做。
📋 目录
  1. Ⅰ 先把导出的要点文本放到编辑器里显示不可见字符
  2. Ⅱ 定下固定字段与缺项处理规则
  3. Ⅲ 用表格的分列功能做第一轮拆分
  4. Ⅳ 用通用脚本骨架做批量归并
  5. Ⅴ 抽样对照原文并核对行数
A A

多个项目的要点文本堆在一起,直接粘进表格经常错行,原因通常不在表格软件,而在于每份文本的分隔符、字段顺序和空行习惯都不一样。可行的顺序是:先把不可见字符显示出来,确认实际用的是哪种分隔符;再定死字段和缺项规则;结构规整的部分先用表格分列跑一遍;重复条目多的部分交给脚本批量归并;最后抽样对照原文并核对行数。这套流程不依赖任何官方导出接口,只要能拿到原始文本就能做。

判断:要不要写脚本,取决于同一份文本里条目行是否已有几十条以上、且分隔符基本一致。适用场景是各项目要点由人工从不同地方复制而来,格式不统一。操作上是先做字段对齐,再做批量归并;验证靠抽样逐字段比对加输出行数核对。边界:如果分隔符在事项正文里也会出现,需要先定好转义方式或换用更长的分隔符,否则先别急着自动化。

先把导出的要点文本放到编辑器里显示不可见字符

在编辑器里打开原始文本后,先把不可见字符打开,否则你看到的空格和分隔符全是“假的”。VS Code 可以按 Ctrl+Shift+P 搜索 Toggle Render Whitespace,或在设置里把 editor.renderWhitespace 设为 all;Notepad++ 走“视图 → 显示符号 → 显示所有字符”;命令行直接用 cat -A raw_notes.txt 或 sed -n '1,20l' raw_notes.txt,制表符会显示成 ^I,行尾会有 $。

打开之后,按三种句式分别记录特征:标题行通常以项目名开头,一般不含分隔符;条目行至少含一个分隔符;空行单独占一行,用来分隔不同项目块。常见分隔符有这几种,写下来备用:

  • 英文竖线 |:最常见,但事项正文里也可能出现
  • 制表符:显示为 ^I 或一段对齐的空白,从网页复制粘贴时经常带出来
  • 全角竖线 |:肉眼几乎和英文竖线一样,必须靠显示不可见字符区分
  • 连续两个以上空格:不稳定,建议只在没有其他选择时使用

用编辑器的查找功能分别数一遍标题行和条目行的条数,把数字记下来,后面核对行数时要用。

Ok Work 整理出的项目要点想汇总成表 / 先统一字段再写脚本批量归并

定下固定字段与缺项处理规则

字段先定死,再谈归并。建议按下面这张表统一,字段顺序在整批数据里保持一致:

字段含义是否必需缺失时怎么处理
项目名来自标题行,需向下填充到每条记录必需不允许为空,为空说明标题行没识别到
负责人责任人姓名或工号可缺留空
时间截止时间或更新日期可缺留空;格式不统一时先在原文里统一,不要指望脚本猜
事项具体条目内容必需不允许为空
状态进行中 / 已完成等可缺用同一个占位符,如“未标注”

缺项只选一种处理方式:要么整批全部留空,要么整批使用同一个占位符。混用会让后续按状态筛选时漏掉数据。项目名这一列需要特别处理,因为标题行本身不带其余字段,归并时要把它向下继承给该标题下的所有条目行。

用表格的分列功能做第一轮拆分

结构规整的那部分文本,不必写脚本,先在表格里试拆。Excel 的操作是:选中整列 → 数据 → 分列 → 选择“分隔符号” → 下一步 → 勾选“其他”并填入 | → 下一步 → 完成。Google Sheets 可以走“数据 → 拆分文本为列”,或用 SPLIT(A1,"|") 公式。

Ok Work 整理出的项目要点想汇总成表 / 先统一字段再写脚本批量归并

拆之前先把原始整列复制一份放到右侧备用,拆错时按 Ctrl+Z 撤销,或者删掉拆出来的列,从备用列重新拆一次。这一步只处理分隔符统一、没有嵌套分隔符的文本,凡是拆完列数明显多出来的行,先挑出来单独看。

拆完抽查三个位置比较可靠:第一行,看表头有没有被当成数据一起拆;最后一行,看末尾有没有被截断;中间任选一条缺字段的记录,看空缺位置有没有整体左移。左移基本就是缺项处理规则没统一造成的。

用通用脚本骨架做批量归并

条目多、手工粘贴不现实的文本,用下面这段骨架。运行前把 FIELDS 换成上一步定好的字段名,把 SEP 换成你实际的分隔符(制表符写 "\t"),并把 expected 填成人工统计出的条目数。脚本放在与原始文本同一目录下执行即可。

Ok Work 整理出的项目要点想汇总成表 / 先统一字段再写脚本批量归并
import csv
from pathlib import Path

SRC = Path("raw_notes.txt")
OUT = Path("items.csv")
FIELDS = ["项目名", "负责人", "时间", "事项", "状态"]
SEP = "|"          # 制表符写 "\t",全角竖线写 "|"

def split_line(line):
    # 只切前 len(FIELDS)-1 次,避免事项里再出现分隔符时被切开
    parts = [p.strip() for p in line.split(SEP, len(FIELDS) - 1)]
    parts += [""] * (len(FIELDS) - len(parts))
    return parts[:len(FIELDS)]

def load_rows(path):
    rows = []
    for raw in path.read_text(encoding="utf-8").splitlines():
        line = raw.strip()
        if not line or line.startswith("#"):   # 跳过空行和注释行
            continue
        rows.append(split_line(line))
    return rows

rows = load_rows(SRC)

# 校验一:每条记录字段数必须与表头一致
for i, r in enumerate(rows, 1):
    assert len(r) == len(FIELDS), f"第 {i} 行字段数异常: {r}"

# 校验二:输出行数须与人工统计的条目数一致
expected = 0   # 由 grep -c 或编辑器查找得到,填入后断言生效
if expected:
    assert len(rows) == expected, f"条目数不一致: 输出 {len(rows)},预期 {expected}"

with OUT.open("w", encoding="utf-8-sig", newline="") as f:
    w = csv.writer(f)
    w.writerow(FIELDS)
    w.writerows(rows)

print(f"写出 {len(rows)} 条到 {OUT}")

utf-8-sig 是为了让 Excel 直接双击打开时不乱码,如果只用命令行查看,用 utf-8 也可以。统计条目数可以用 grep -c "|" raw_notes.txt,但前提是正文里不会出现同样的分隔符,否则这个数字本身也不准,需要改用手工数或按标题行分块计数。

抽样对照原文并核对行数

脚本跑完不等于结果正确,抽五条回原文比对是最省事的一步。从生成的 CSV 里随机挑五条记录,用项目名加事项里的关键词回原文搜索,逐字段核对:负责人和时间有没有串位,事项有没有被分隔符截断,状态是不是从上一行带过来的。五条里只要有一条对不上,就整批停下来查。

行数不一致时,回查顺序建议这样排:先看字段数断言有没有通过,字段数报错说明某行含嵌套分隔符;再确认空行、注释行和标题行是不是被当成了条目行;然后检查文件末尾是否缺少换行,导致最后一条被吞掉;最后确认项目名的向下继承逻辑有没有在跨项目块时失效。这几步查完,错位通常能定位到具体是哪一类行引起的。